Monday, January 4, 2016

How to Be a Better Programmer Part 2-1



https://www.theeffectiveengineer.com/book
What if through better tools and workflows, we could develop software more quickly? Then we would have more chances to iterate and get things right.
What if we could get feedback sooner on whether projects would work? Then we could abandon any unpromising efforts early.
Or what if we could make better estimates about how long different tasks would take? Then we could make better choices about what to cut and what to prioritize.
http://www.wanwuyun.com/pages/news/317.html
      1.勇于去研究你不懂的代码
      一般人都不愿意去研究自己不曾接触过的代码,很多人都没有尝试就放弃了。如果你经常去研究你没有接触过的代码,你就会越来越熟悉不同的代码结构和设计模式。现在人们很容易就接触到优秀的开源代码资源,你可以很方便的就下载下来做一些改动或者调试,去研究为什么代码可以这么写。
      除了代码之外,很多人对于陌生的工作内容也会感到恐惧。每次换工作的时候,你可能都会遇到新公司的工作内容和以前工作的内容不一样的情况,以至于刚开始的时候工作效率没有以前那么高。很多人甚至觉得,他们是不是骗了面试官。
      其实,大家都是在学习的过程中。在一个陌生的领域,没有人从一开始就是大神。如果你想变得越来越好,无论是写代码,与人沟通或者其它的技能,都是需要投入时间去学习的。
      2.精通代码调试(debug)
      很多人在写代码的过程中,经常会有的一个问题就是:为什么我写出来的代码不能运行?为什么运行的结果不是我想要的?
      几乎所有的程序员写代码都不是一遍就能写好的。但是顶尖的程序员非常快的就明白自己代码的问题可能是什么。这是一个很重要的能力,但是偏偏学校里不教,面试的时候考官也不经常提及。
      那么怎么去调试代码呢?其实核心就是以下几个方法:
      不妨先猜测一下到底发生了什么。
      假设你的猜测是对的,想想你的猜测会导致程序有什么结果。
      试着观察这些结果有没有异常的地方。
      如果你没有发现异样,那么说明你的猜测就是对的。
      如果你发现了异样,那么说明你的猜测是错的,接下来换一个猜测试试。
      对于顶尖程序员来说,这个过程在脑海中就是电光火石的一瞬间。只要你解决的问题足够多,你做出来的猜测就会越准确。
      至于如何发现异样?你就需要有一套自己的工具或者方法论了。最简单的就是在代码里输出日志来判断。但是这是比较笨的办法,你需要去接触一些高级的工具或者直接带有Debug功能的编辑器。
      3.重视能够节约时间的工具
      最近打败人类的AlphaGo每天可以进行上百万局的下棋训练,我们人类一万个小时的训练却需要10年之久。也就是说,电脑运行几分钟,可能就等于人类工作好几年。
      曾经在Facebook担任技术总监的Bobby Johnson描述过,高效率的程序员都把时间花在制作工具上。
      很多人也认为工具是很重要的,但是他们并没有花时间去制作、整合自己的工具。但是,Jonson团队最出色的员工耗费了他们1/3的时间在工具制作上,这些工具可以用来发布代码,监控系统,以及能让他们花更少的时间去做更多事情。
      总之,不要花时间去做机器可以代替你去做的事情。
      4.优化你的迭代速度
      假设你要花12秒钟去搜索某个函数是在哪里定义的。再假设你每天做这个动作60次,那么你每天就要花12分钟去搜索函数定义。
      如果你用一个好一点的编辑器,每次找到函数定义只要2秒钟,那么你每天就会节约10分钟。每年你就可以节约40个小时。
      如果你能找到3个这样的场景去优化一下,那么你每年可以节约一个月的时间。想想这一个月你可以做多少有意义的事情。
      再假如你在调试一个App的bug的时候,改完一次代码都需要重启一下App,然后点击4、5次才能看到bug有没有改好。那么你是不是可以先花几分钟设置以下,让App一启动就转到显示Bug的页面呢?
      千万不要小看这些琐碎的细节,改善它们的回报是巨大。
      5.系统性的思考方式
      当你在写代码的时候,你很容易就认为只要你按照需求实现了指定的功能,你的代码就写完了。但是这其实只是冰山一角。任何没有发布到生产环境的代码都不会产生任何价值。
      如果想写出真正有影响力的代码,你需要从整个系统去理解你的工作:
      你的代码和其他人写的代码在功能上是什么关系?
      你有没有好好测试你的代码?或者其他人是否很容易测试你的代码?
      为了部署你的代码,线上生产环境的代码是不是需要改动?
      新的代码会不会影响到已经运行的代码?
      在新的功能下,你的目标用户的行为是不是你期望的?
      你的代码有没有产生商业上的影响?
      这些问题都不是很容易就能回答的,但是在写代码的时候,你需要明白你的代码最后会不会得到最好的结果。
Mistake #1: I spent too much time learning things that I didn't actually need
I should've narrowed down the list to only what I needed for a working prototype.

Mistake #2: I didn't start coding right away.
I should've learned by working on small projects from the very beginning.

Actively take some tutorials and code the examples. David Sinsky, a fellow Yipit developer, has some amazing suggestions.
Pick an easy project and code it. Try creating a simple blog or a basic polling app.
Repeat #2 a few times.
Build your startup prototype.
https://codingstyle.cn/topics/41

走出自己的舒适区

首先要走出自己的舒适区,接触一些不熟悉的技术领域。比如后端很熟悉了,去写写前端试试。Web 很熟悉了,去写移动端试试。
业务开发很熟悉了,去研究一下搜索,推荐系统,大数据试试。OO 很熟悉了,玩 FP 试试。
老守着自己会的那点儿东西,总有一天会坐吃山空。

发现自己的不足

有以下方式:
  • 录视频
  • Code Review
  • 结对编程
  • 参加编程道场
没有对比,很难发现自己的不足,所以把自己的代码和编码过程展示出来,一定会发现许多可以改进的地方。
只有菜鸟才会觉得自己特别牛,因为物以类聚,他的圈子里全是菜鸟。
你越牛,接触的圈子也越牛,你越会觉得自己渺小。

程序员练什么?

程序员要练习东西很多,一些基本功如下:
  • 打字
  • 编程语言
  • 编程范式
  • 编辑器
  • 快捷键
  • TDD
  • Clean Code
  • 重构
  • ...
http://www.cnblogs.com/shiyuxinglan/archive/2010/05/17/1737057.html
消极、软弱无主见、虚伪、对前途渺茫、混乱无序、怨由心生、虚伪做作、学习时间少、无规划性、代码质量低、手忙脚乱、技术永远停留在“打铁”水平、术业无专攻、低调、迷茫、心态不稳、思想徘徊、生活困难、开发难度大、维护难度大、压力大、难沟通、不满、被动、拿不起放不下、进退两难。
书读的更多更广泛,知道的事也就多,思路更加开阔,解决问题的能力也就能高于常人,从而反过来帮助到你专业能力的提升。

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts