大约是在去年的这个时候,小涛看了我的文章 我的英语学习之路 之后,希望我也写一篇关于怎么学习编程的文章。由于工作繁忙,这事就一直被搁置了下来。今天,是时候来分享一下我的编程学习之路了。
遇见Coding
我很幸运,能够在众多的职业中选择Coding。这是一种不需要太多应酬,只需要专注于当前电脑屏幕的工作。选择这份工作,大概是与我曾经的内向性格,不愿意过多与人打交道有关。而直到今天,我依然庆幸从事这份工作,这份依然爱的火热的工作。
如果你不介意,且静下心来,听我叨叨几句,看一看我是怎么一步一步进入到编程领域的。
机会总是留给有准备的人
其实,我在大学主修的是物理,在大学四年里。留给老师们的印象,并不是那种典型听话的好学生。相反,非常叛逆,我经常挂科,经常逃课,这几乎成为了我大学时代的代名词。为此,我还给了自己一个冠冕堂皇的理由,学习电脑。
是的,我真的在学习电脑,因为那个时候我连打字都不会。于是,我每天逃课去网吧,按照最标准的手势不断地去找人聊天,练习打字,偶尔还会学学dos命令。现在打字速度比较快,大概就是那个时候打下的基础。
其实,那个时候并不知道电脑技术到底有哪些,也不知道该学些什么技术。因此,就学一些老掉牙的知识。比如:dos命令,windows系统安装等等。然后利用这些知识帮宿舍同学解决问题,慢慢地,居然在大家的心目中形成了我是一个电脑高手的错觉。
我想说,一切的机遇都不是偶然的。得益于我在大家心目中形成的这种印象,当学校网络中心招聘兼职的时候,大家异口同声地推荐了我。我也因此碰到了带我进入电脑技术领域最重要的人:杨希龙。
在我的心目中,他是大牛,长得非常帅气,打字速度非常快,尤其是在敲命令的时候,噼里啪啦就像在弹钢琴一样。更重要的时候,他的交流能力也很强。因为我们当时的网络维护是要进到旁边的家属区,要跟住户面对面交流,咨询大概遇到了什么问题。然后去到楼下的交换机,看看是不是水晶头插口松了,或者某些配置错了等等。而那个时候,我其实非常腼腆,他如果感觉到我不敢去,总是带着我一起上去,跟住户去沟通。每次,跟他一起处理问题的过程中我总能学习到很多知识,不仅仅是电脑方面,还有一些未来的方向等等。后来,慢慢地,有了一定的沉淀之后,我开始独立解决问题,独立去查资料,人也变得不那么腼腆了。我开始疯狂爱上了网络维护工作,并且知道了这里其实有着非常高深的学问,远远不止做个水晶头、接个网线那么简单。为了提升自己,在学长的鼓励下,我尝试报考了软考网络工程师考试。我依然清晰的记得当时是在西安交大参加的考试,是一个比较寒冷的冬天。
依然非常幸运地,我以111分的成绩顺利拿到了软考网络工程师证书。这是我在大学第一次让自己得到了大家的肯定,也第一次找回了久违的自信。为了获得进一步的提升,我又用在学校兼职赚到的1700块钱报考了CCNA考试。
这是一门全英文的考试。在网络领域依然是处于初级水平考试,但相对软考,他要求更高的实操能力,需要熟悉Cisco交换机和路由器的基本配置命令,可以配置小型局域网络。不过,这个考试有题库(PS:建议大家把能力练到了一定水平再去看题库),让我更加有自信去参加这个考试。顺理成章地,我以960分的成绩拿到了CCNA证书。这一次,我更加坚定了未来要从事电脑工作的决心。拿到这两个证书其实花了我大量的时间,虽然准备考试的时间并不算长,可为此我也经常熬夜。记得最迟常常会到两三点。加上平时的练习,时间更是不短。那个时候,我以为未来可能就要从事网络维护工作了。而快到毕业的时候,我做了一个大胆的决定,我决定放弃我学习了很长时间的网络知识,开始学习编程。因为我认为网络维护的工作偏服务层面,前景没有那么好,我宁愿选择更有前景的Coding工作。虽然,这需要付出更多的努力。
为了约束自己,我报考了一个培训班,开始了我的编程之路。
这就是我与Coding相遇的故事,没有跌但起伏,却充满了未知。而今天,我要感谢当初的那个决定,感谢当初那个敢想敢做的自己!
严格要求自己
要想学好编程,第一要领就是:一定要严格要求自己!
开始学习编程的时候,像当初学习打字一样,在编程方面我对自己的要求依然非常高。最开始接触的语言是Java,到目前为止,它依然是我使用频率最高的语言之一。当时,我对自己的要求是:写出来的代码必须和eclipse格式后完全一致,并且代码要尽可能短。如果和我一起学习编程的同学还记得的话,应该知道我常常会在他们面前炫耀我的代码有多短,却实现了一样的功能。
虽然同样是IT职业,编码和网络维护却完全是两回事,网络维护需要掌握大量的路由器交换机命令,这其实是在熟悉别人制定的规则。而编程工作其实是自己制定规则,这种自由的感觉我更喜欢。但我却需要付出更多的努力才能习惯这种转换,因此我看了马士兵的教学视频,看了最经典的《Java编程思想》一书。直到现在为止,我依然认为马士兵的教学视频是学习Java语言的最棒的教学视频,没有之一。马士兵对待编程的严谨态度,也一直影响着我。严格来说,是马老师带我进入了编程领域。在这里,非常感谢网络那端的马士兵老师,祝老师身体健康,万事如意。
最初学习编程的时候,我对编码的理解分为两个阶段。第一个阶段:把代码写短。
我认为同样的功能,更短的代码代表更优的实现。因此,我总是想尽一切办法把代码简化。
举个例子:
第一种写法:
public boolean isOdd(int i) {
if(i % 2 != 0) {
return true
}
return false
}
第二种写法:
public boolean isOdd(int i) {
return i % 2 != 0
}
我会认为第二种写法更优,当然事实也是这样。不过,后来我发现代码太短,常常会导致部分情况考虑不周。因此,进入到了第二个阶段:把代码写长,尽可能考虑各种异常情况。
当然,现在再去综合考量,我的观点是:把代码写短!如果能保持言简意赅,我们就要尽可能地将代码写短,但不能因为过度追求简短而完全丧失了代码的可读性。
在编码方面,我对自己的另一个严格要求就是:绝对不允许出现错误的英文单词!一定要见名知意!因此,我在编码的时候,对待命名,我总是小心翼翼。熟悉我编码风格的人会发现我常常在命名的时候想很久。其实,这很重要,一个好的命名会让代码的可读性提升不少,在长期的开发过程中,这会节约大量的时间。因此,对待命名大家千万不要随心所欲。
现在想想,或许正是当初对自己的严格要求,才形成了现在良好的编程习惯。
Tip 1
因此,初入编程的同学,一定要严格要求自己。无论是编码,打字,还是拼写,都要做到一丝不苟。要知道,笔者当初为了练字就换了好几种手势,不断地去偏离舒适区,去强迫自己改正。
PS:现在发现Coder打字不标准,或者需要看键盘才能打字。这样的Coder,无论其能力多高,职位有多高,在我这里的印象分起码降低30。因为,他连一个Coder的基本职业素养都没有达到。
想尽一切办法提升自己
Coding是一个学无止境的工作,如果你和别人付出一样的努力,你的能力也会和别人平平,慢慢就会淹没在Coder的人潮里。
为了能够最大限度地提升自己,一定的“手段”是必不可少的。但首先你要有准备提升自己的决心,很多人跟笔者说,回到家就不想写代码了。对于一个老Coder,如果工作非常繁忙,太过于辛苦,回到家,只想喝杯茶,陪陪老婆,看看电视,完全可以理解。而如果一个新手,这样跟我说,那我告诉你。
A few years later u will became a loser !
引用一句非常经典的中国民间俗语,这种人叫做:
烂泥扶不上墙
可是,有什么好的办法可以快速提升自己呢?答案是有很多!如果你像笔者一样,偶尔会偷懒的话,不妨逼迫自己一把。找一份Coding的兼职,尝试独立开发一些产品。
笔者在加油宝工作的时候,曾经有一段时间相对轻松。为了提升自己,我尝试在58同城找兼职,顺理成章地,我找到了一份兼职。开始了一边做公司业务,一边做兼职工作的忙碌生活,这样的生活让我倍感疲惫。现在想想,虽然辛苦,却是在给未来铺路。中国有句话叫做:不经历风雨,怎能见彩虹。我始终坚信这个道理!
这份兼职有过一段不太愉快的经历,但却让我具备了独立开发的能力。同时,在对人生的理解上也有了更深的感悟。那个时候,我告诉自己:男人生来就是来吃苦的!感谢那段经历,让我明白了吃苦其实是我的专利!
Tip 2
新手同学经历过一段时间的历练之后,往往会进入一定的自我满足期,这个时候他的自信心上来了。并且认为自己已经通晓了编程的大多数道理,带来的结果就是:止步不前!
如果你发现自己恰好和上面描述的一致,说明你已经进入了舒适区,在舒适区呆久了,你就会慢慢地“死”掉。所谓“温水煮青蛙”就是这个道理。
这个时候,一定要告诉自己,我要想办法提升自己。为了实现这个目标,你可以:
1)尝试做一些兼职,提升独立编码能力
2)尝试开发独立APP,提升架构能力
3)尝试阅读成熟源码,写一些分享类的文章
方法有很多,但一定要记得不断提醒自己:走出舒适区,想尽一切办法提升自己!
不断尝试新的东西
在长期的编码过程中,Coder都会形成自己的舒适圈子。很多人一听到新东西,多年来形成的惯性思维就会让他充满恐惧。因此,敢于尝试新鲜事务的Coder不多,当然有些时候这也会受限于公司的约束。
一直在一个熟悉的领域,一直在从事相同的代码,会让一个人慢慢对Coding失去了兴趣,或者说,会慢慢地成为代码工人,即所谓的码农。笔者最讨厌码农,在加油宝曾经偶遇女码农,这大约就是我的人生黑洞,也促使我反向思维,寻求不一样的解决方案。
笔者在尝试新鲜事务上的确有不一样的理解,在过去的这几年里,我先后学习了如下几门编程语言:
- Java
- C++
- OC
- Swift
- Kotlin
先后接触了下面这几个平台:
- Java Web
- Android
- iOS
就在去年8月份,我做了一个大胆的决定,我决定使用Kotlin语言完成喜金会APP的开发。对于Kotlin语言,我已经在文章中写了很多了,感兴趣的同学可以去看一下。Kotlin语言并不是官方指定的Android开发语言,很多人认为Kotlin语言可能会存在一些不稳定,或者出现一些未知Bug等等。可是,事实证明,Kotlin语言版本的喜金会运行的很好,并且比用Java语言写的Bug更少,也更稳定。事实上,如果你不去尝试,你永远不知道结果是什么。
** 当你还在犹豫的时候,我已经用上了Kotlin。**
PS:尝试新的东西,会让你对现有的知识有不一样的理解,并且能够让你在编码的过程中举一反三,如鱼得水。这些大约只有等你具备了这个能力之后才能感受到。因此,Just do it。
写有灵魂的代码
要理解这一部分,起码你已经遵守前面所说的编程规范,并且具备了一定的工作经验。
代码每个人都会写,可是能把代码写的有核心思想,有灵性的人却很少。
笔者所接触的语言,基本都是面向对象的语言。现如今,面向对象的概念已经深入人心。即所谓面向对象,其实就是对现实世界的影射。
因此,在写面向对象的代码的时候,一定要考虑设计的合理性。是否合乎常理,是否存在歧义等等。
很多Coder都存在一个问题,就是将对象随意嵌套,而不管对象之间是否存在一定的关联。这个时候,我常常开玩笑说,你让一条鱼怀上一只猫,你觉得合理吗?
这个思想其实不难理解,因为代码是对真实世界的影射,就一定要符合现实世界的规律。如果打破这个规律,将造成代码无法阅读,难以理解。
这里引用马士兵的一段教学,请大家尝试将下面这段话翻译成面向对象代码
老王开车去东北
往更深层次里面说,没有人会一直当一个客户程序员,总有需要给其它程序员提供接口的时候。这个时候,你就上升到了SDK程序员级别。初入这个水准的时候,常常会犯一些不自觉的错误,因为过去一直在给自己写接口,突然提升到给客户程序员提供接口。这种突然的转变会让很多Coder感到头晕目眩,极其不适应。
这里交给大家一个方法:
当你在给客户程序员写接口的时候,第一人称一定要变成他。不断地问自己:
他会觉得好用吗?可以实现他的所有需求吗?他会不会觉得我写的太烂...
有人说,这是一种不自信的表现。其实,恰好是这种不自信会促使你写出更漂亮,更优秀的代码。
这里推荐大家看我的另一篇文章 如何设计一个好的接口
不断否定
一个优秀的Coder一定要具备精益求精的工匠精神,在不断的系统更新迭代中,如果发现某些问题有更好的解决方案,一定要勇敢地否定自己。然后尝试用更好的解决方案去解决问题。
中国的大部分Coder在代码写完后就置之不理,无论代码多烂,千年都不会变。给的理由常常是:我害怕改动一个地方出问题,我害怕重构代码需要花费大量的时间... 对此,笔者常常一笑了之,你大约也就这样了吧...
在编码领域,没有人可以一次性写出非常优秀的代码,好的代码总是在不断地重构中优化。这个道理大概每个Coder都懂,可是却很少有人会去理解其中的精髓。或者即便理解了也懒得去做,这的确有点令人伤感!
Tip 3
不断否定自己的代码,会让你的编码能力不断提升。最终可以达到国际水准,具备一流的编码能力。这是一个漫长的过程,而如果你不去做,就永远达不到这个层次。因此,尝试去重构它吧,不要在犹豫了!
总结
在过去的一年里,笔者在OsChina共创建了59个版本库,提交了1062次代码:
在Github上面共创建了67个版本库,其中14个Source版本库。
在几年的Coder职业生涯里,不敢说兢兢业业,但起码也是勤勤恳恳。最后这个总结,希望你明白,一切都不是偶然的。不经历风雨,怎能见彩虹!
Coding并不难,坚持Coding却很难,找到好的提升方法更难。希望今天这篇文章能够给大家有所感悟,找到适合自己的提升方法。
代码是程序员的第二张脸,不断地打磨,甚至粉饰妆黛都是很有必要的。因为,你是什么样的人,就会写出什么样的代码!