程序员练级攻略:程序员修养学习总结

What are some of the most basic things every programmer should know?,我也就贴个高赞答案在这吧,大家都知道Quora是原版的知乎,现在知乎是一点都不值得看了,但Quora说实话也不怎么火了,感觉很多国外的内容创作者也离开了这个平台。

  1. Bad architecture causes more problems than bad code.
  2. You will spend more time thinking than coding.
  3. The best opportunity to get paid more is when you’re negotiating salary before getting hired.
  4. People skills determine your success more than technical skills.
  5. Users will find impressive and bizarre ways to solve their own problems.
  6. Commit code more often.
  7. Always work in feature branches.
  8. Basic UNIX skills are helpful, but not required.
  9. Learning VIM or EMACS will change your world.
  10. All estimates are lies and “good estimates” are bigger lies.
  11. 80% of programmers are barely capable of doing their job.
  12. Businesses exist to make money, not to make code.
  13. Software exists to solve problems, it’s not art.
  14. Agile is a trap. You can’t avoid it.
  15. 80% of programmers never invest in improving their skills and never learn outside of work.
  16. Your boss believes you are replaceable.
  17. Work is a job, not a family, not a church, not a religion. You do it to get paid.
  18. Company culture is often used as a trick to pay you less money.
  19. The best programmers are always building things.
  20. Your IDE doesn’t matter.
  21. The language you use doesn’t matter.
  22. The framework you use doesn’t matter.
  23. All technology arguments boil down to children fighting over which toy to play with.
  24. You probably won’t get rich by winning the startup lottery.
  25. Make friends with QA testers, they will make your life better.
  26. Always know how your business makes money, that determines who gets paid what.
  27. If you want to feel important as a software developer, work at a tech company.
  28. People will always prioritize new features over refactoring legacy code.
  29. Sometimes a train wreck has to happen for anyone to care about the brakes.

97 Things Every Programmer Should Know,这篇文章内容是蛮多的,所以我一般会先看标题,看的懂得话就跳过了。如果标题看不懂了,才会看看内容,看看文章表达的意思。

英文能力

  1. 我自己用过几次英文搜索后,尝到甜头后,我就尽量用英文搜索问题了。关于IT问题,英文和中文的互联网就是天差地别啊。现在搜索引擎这么智能的情况下,你只要会最简单的疑问句语法就可以遨游了。

  2. 用英文写注释,commit,Issue和Pull Requ,以及Wiki都是短句,对于我主要还是心理障碍,真写起来也就会有些小问题罢了,谷歌翻译就能解决了~

  3. YouTube上看5分钟,其实就是为了练听力,让自己保持英文的输入,千万不能对英文生疏。

  4. 字典我喜欢用朗文的LODCE5,搭配着用欧陆词典,电脑端查单词,再手机上背生词,方便。

  5. 英文教材的话,我比较喜欢用恶魔的奶爸推荐的教程,不过他的学习路径还是以听力为核心的,需要花很多很多时间去练耳朵。

  6. 最终还是要通过老外来检测和提高自己的能力,大不了就花些钱嘛。

    这里有一个隐含的能力要求:科学上网。对于这个,我只能说你要你想,这个能力你就可以掌握。去搜索吧。

问问题的能力

学会问问题是一个非常非常重要的能力,因为大多数情况下别人是不知道你的工作细节的,别人只能通过你的问题来帮助你。一旦你的问题问偏了,别人的回答再怎么正确都帮助不到你,这是我实习阶段学到的教训。

《提问的智慧》

我们回答问题的风格是为了适应那些真正对此有兴趣并愿意主动参与解决问题的人

上面这句话是我觉得这篇文章的核心,我会把这句话牢牢记在心中。我遇到实际问题时,操作流程是先“读读该死的手册”(RTFM)和“搜搜该死的网络”(STFW),再去“提问前”,最后才是“提问时”。

《X-Y 问题》

没有去问怎么解决问题X,而是去问解决方案Y应该怎么去实现和操作。X-Y Problem最大的严重的问题就是:在一个根本错误的方向上浪费他人大量的时间和精力

FAQ for Stack Exchange sites

这个虽然是针对Stack Exchange sites的常见问题和回答,但可以把它看作对所有社区问答的规范参考。Asking questions中的前两个,是对我帮助最大的。

写代码的修养

《重构》、《修改代码的艺术》和《代码整洁之道》,我打算以后再看了,因为我在看了一段时间后发现我对这块知识掌握的不好。我承认代码是需要整洁、健壮性和鲁棒性的。但是对于现阶段的我来说,我的代码量还是太少了。现在的我的代码是去从零到一的过程(实现功能),是把官方文档和别人的代码改写成自己的代码,等过一段时间再看吧。

《程序员的职业素养》这本书不单单让你知道成为一名专业的程序员需要什么样的态度、原则,需要采取什么样的行动。它还会帮助你成为更好的一个人。

Code Review

这几篇文章算是开开视野,看看别人是怎么做Code Review的,我一开始是在业务性公司实习,他们好像还真得不做Code Review。不过我的leader,他有空的时候会帮我看看,但他有空的时候不多。下份工作,找一个能做Code Review的公司吧。

Unit Test

JUnit是大多数Unit Test的框架衍生出来的,最起码unit test就是。因为我一直在做Python web的工作,我就没有去看JUnit了。我去看了 unittest — 单元测试框架Unit Tests in Python 。这样的学习也只是粗浅的了解。要是想要深入掌握,还是要在工作中,去理解实际的代码以及Unit test的代码,并且将它们结合起来。

安全防范

虽然说是OWASP中的top10都是需要避免的,但是我感觉XXS,CSRF和SQL注入是最重要的吧,或者说是考察最多的。

Guideline倒是没怎么看懂。

Hardening Your HTTP Security Headers 安全表头,文章大概是先解释了各个表头以及怎么在Nginx和Apache中使用,最后就是教了三种检查http安全表头的方法。

防御性编程(Defensive programming)

是防御式设计的一种具体体现,它是为了保证,对程序的不可预见的使用,不会造成程序功能上的损坏。它可以被看作是为了减少或消除墨菲定律效力的想法。防御式编程主要用于可能被滥用,恶作剧或无意地造成灾难性影响的程序上。

维基上的那个例子其实我没看太懂。不过,我举个例子:web的手机验证码登录,会限制输入上限为6位,超过的部分就不能输入了,这个应该算是防御性编程吧。

The Art of Defensive Programming

记几句,我觉得有点意思的句子,后几个建议在《代码大全》里见过,就不记了。

Defend against the impossible, because the impossible will happen.

Never trust user input

Assert that your input values are what you expect.

Use database abstraction

Overly defensive programming 这篇说实话,我看的不太懂,代码也不懂,大意是过度防御编程?

软件工程和上线

《完美软件》这本书挺难买的,甚至连电子版我都没有找到,只能搁置一旁,以后有机会再看了。

《Google软件测试之道》 不是技术为核心的公司是做不到这样的,而且测试在中国的程序员中的地位和作用太低了,而谷歌对测试要求基本是一个会研发的产品经理,然后这个人的主要工作是测试,这怎么说理去呢。这本书我收获最大的应该是,要不择手段的提高工作效率。其次的话,就是了解了谷歌的工作方式。

Checklist,是我以前没有意识到的,没有想到上线还是需要进行一系列的检查的。而且其中检查我也不是完全都懂,算是了解吧,还是得上线一个应用,这个过程才能完全掌握吧。

Monitoring 101: Collecting the right data

Collecting data is cheap, but not having it when you need it can be expensive, so you should instrument everything, and collect all the useful data you reasonably can.

我以前,出了问题大概就会说,看日志啊。这篇才是真的看日志。最少算是知道了:工作指标,资源指标,事件,以及什么才是值得收集的好数据,警报和诊断数据。

编程规范

现在基本都是靠着IDE来管理,但是有空还是要看一下的,我觉得倒不是都要看,这个真的是可以要用的时候再去看就可以了。因为你得先把程序语言弄懂了,再去弄懂它的编程规范嘛。

最后说说开发工具:

  1. Markdown:现在文章基本都是采用md格式。

  2. JSON:你会在无数地方看到数据以这种形式来存储。

  3. Git:代码管理以及合作开发都靠它。

  4. 正则表达:我是在写URL和爬虫中用到过它,检索和替换全靠它。

    这四个在编程中都是很重要的,都是属于那种你需要知道最基础的知识和用法,但是仅此是不够的。一旦深入用起来,还是要查文档,边学边用。同时,这也是我对这一篇文章的整体印象。

总的来说,这篇程序员修养是挺奇怪的,它不算程序员的内功,也不算外功。但是你看过之后,好像每个知识点还真得都知道。

接下来,我要去补基础了,我要去啃计算机专业最难却也是最精华的知识了。想想还有些小激动…