如何成为一名优秀的程序员
前言
董明伟基于自己实践讲的知乎live为Python新人提供了很多实用建议,他推荐的罗子雄:如何成为一名优秀设计师的演讲讲的非常好,总结了设计师从入门到提高的优秀实践。
罗子雄的演讲我看了三遍,再结合自己的程序员生涯,我想我也可以为Python新人提供一些建议,开了如何成为一名优秀的程序员一题,讲讲我的Python工程师之路。
入门
一个非科班出生的程序员入门总是困难的,找到正确的学习方法,才是这一阶段最重要的目标。如罗子雄总结的设计师之路,程序员也需要看,做,想。
看(学习)
书:
《Python核心编程》
《Python Cookbook》
《SQL必知必会》
这是我入门Python选择的书,很厚,硬着头皮读下来,做了很多笔记,有很多东西一时都不会懂,但是没有关系,很多时候我读书不是为了理解书里面所有的东西,而仅仅只要知道书里面有哪些东西,等到用到的时候可以再回来学习,再来查,《Python核心编程》可以作为一本Python语法,基本数据结构用法的参考书。
《Python Cookbook》提供了很多经典的解决现实问题的代码片段,建议把每一个片段都自己写一遍,可以加深对Python的理解,也为下一步做提供很多解决问题的思路。这本书也可以作为参考书,碰到与书中类似的问题都可以参考一下那些代码。
《SQL必知必会》是一本SQL入门书,能快速帮助你掌握基础的SQL语法。作为一名Web开发工程师,掌握SQL是必需的技能。
做(实践)
在学习了一些Python语法,了解了一些解决问题的思路后,下一步就是实践了。
这里推荐廖雪峰的实战篇教程,实现一个完整的Web APP。虽然教程只有16天,但是我却花了2个月。作为一个新手,我会发现很多章节根本不可能1天搞定。可能某一天我面对的不是一个问题,而是像洪水一样冲向我的一堆问题,这个时候我需要做的是分解问题,把1天的内容分解到1个星期来完成。
HTTP,database,MVC,javascript
以上这些姿势都是我完成教程的过程中学到的。很多时候我会发现即使看过了教程,还是不能按照教程的思路去写自己版本的代码,我需要的是去抄,教程提供了参考代码,我会把代码抄下来,在抄的过程中去想为什么要这么实现,同时学习http协议,db的相关姿势。能读懂代码并且能模仿写出自己的代码这就是我实践的目标。
https://github.com/zhu327/blo...
为了管理我的代码,还需要了解下Github相关姿势,以上就是我入门Python最重要的一个项目,找到一个适合自己的入门项目确实可以事半功倍。
基于教程我实现一个内容发布系统,下一步我想在这个项目的基础上把它改造成我想要的样子,比如一个Blog:https://github.com/zhu327/blog
想(思考)
回过头来看看自己写的代码,需要去思考有没有更好的实现方法,代码如何能写的更简洁,以及一些必备的注释,日志信息。在思考的过程中更重要的是认识自己的不足,只有正确的评估自己,才能准确的定制下一阶段的目标。
提高
现在我已经入门了,可以开始考虑如何找到一份Python Web开发的工作了。
看 v2.0
我需要去了解招聘企业对于Python工程师的要求是什么。
http://107.170.207.236/job_an...
从以上分析我可以看到几个比较重要的关键字:
linux, Django, tornado
所以我需要学习以下姿势:
安装ubuntu学习linux使用
阅读Django教程
阅读tornado教程
这里有我整理的一份Python中文资源存档
做 v2.0
Django是招聘企业需求最多的框架,所以我的第二个实践项目会实现一个Django的论坛。
https://github.com/PaulGuo/F2...
F2E是一个Tornado实现的论坛,在学习了Torando的基础教程后,我就可以开始阅读这份F2E论坛的代码。首先我要列出我需要了解的部分:
数据库的设计,创建需要的表
URL路由的设计,整理一份URL功能清单
现在我已经拿到一个论坛的需求了,下一步就是用Django来实现这个论坛,说得更low一点:用Django翻译一下这个Tornado实现的论坛。
https://github.com/zhu327/forum
以上就是我最终实现的论坛,通过这个论坛,我基本上学到了Django开发的方方面面。对Django有了一个比较深刻认识。然后拿着这份代码我找到了自己的第一份Python开发工作。
想 v2.0
开始了新的工作,需要想的就更多了,考虑到自己的不足,可能需要列出一个成长的书单来弥补自身的短板。这里列出一些关注点:
代码质量
面向对象
设计模式
数据库优化
坚持
从入门到找到第一份开发工作,可能需要3~4个月的时间,考虑到不是脱产学习,需要的时间就更久了。在这个过程中我会遇到各种各样的问题,而每个问题都可能会打击到我想要放弃。
我想这个时候我需要考虑的是为什么要做程序员,为了加薪,为了兴趣,为了更好的生活等等。我是以成为程序员为目标开始学习的,所以我必须坚持,直到达成自己的目标。
解决问题
软件开发的过程实际就是解决问题的过程,一个大的系统经过架构设计被分解成一个个小的部分。而分配给我的需求也会被我再次分解成更多的小问题,在这些问题中有我们能直接解决的,也有我可能解决不了的。对于这些解决不了的问题,我的处理路径:
分析问题
Google
找同事商量(一般在Google找不到的情况下)
正确的Google方式是用英文搜索,不需要正确的语法,只需要几个能清晰表达自己问题的关键字就够了,英语实在不好怎么办?可以先在Google翻译查好单词再搜索。
以下有几个搜索技巧:
Django group by site:stackoverflow.com // 只搜索stackoverflow的问答 Django doc Filetype:pdf // 只搜索pdf格式文档
正确的提问
在向同事提问之前,需要有自己的思考,能详细的描述问题出在哪里,大概引出问题的原因,以及自己分析的问题解决方式(如果有),表达出了这些以后,被问同事才能根据你提供的上下文来分析问题。
一定要避免这么问:
xx问题怎么弄(没有自己的分析,没有Google)
帮我看一下这个异常(没有自己的分析,没有Google)
扩展视野
我做的想的越多就越觉得自己的知道的太少,为了扩展视野,我订阅了一些站点:
董明伟的Python订阅列表:https://zhuanlan.zhihu.com/p/...
Awesome Python: https://github.com/vinta/awes...
时间管理
工作的时间久了,摸索出一套适合自己的时间管理方式。由于需求的不确定,我不会定制周计划。基本上每天早上到公司会看一下邮件,列一下当天需要处理的事情,大概分析一下每件事情需要的时间,然后分配一下时间到各个时段,固定每天下午5点分配一个小时的时间用来看收藏的还没来的及看的技术文章。
在项目空窗期,会找一本能迅速提升自己某方面能力的书读读,比如我意识到需要优化MySQL的性能的时候,去看了《高性能MySQL》。
人都是有惰性的,学习也是枯燥的,但是成为一名优秀程序员的目标会驱动我去不断补齐自己的短板。