一个很有借鉴价值的编程故事

转载:http://kb.cnblogs.com/page/510039/

摘要:一周七天,每天学一点在线课程,哪怕一次只有半小时,只要坚持不懈,你就能感觉到自己今天做出的决定是正确的。请记住:只要有耐心,任何能干的人都能成为绝世coder,当然也包括你。

  英文原文:A Cautionary Tale of Learning to Code

  这是一个真实的故事,关于我自己的。一个理智的生命个体是怎么一步步走向疯狂?

  我穿着西装,坐在办公室里,脑子里有一个模糊的创业想法。然后,我决定学习编程。我曾经无意中听到过几个人在那吹牛说自己怎么使用一种叫Ruby的语言轻松实现自动办公。我想“呵,Ruby”。我回到家,谷歌Ruby。15秒之后,我随机选择了一个Ruby教程,开始学习。

  一周以后,我参加人生中的第一次黑客聚会。在场的每个人都在讨论什么Scala,Clojure,Go。我想,他们学得还真是多。转身我就借了三本O‘reilly的书,每本书看了大概50页。

  什么?你问我为什么没有完整地看完一本书?那还不是因为每本书开始的时候简单易懂,然后就开始做假设,假设你具备这个知识,假设你会使用那种工具,可是这些我都不会好吗?

  我的一个朋友告诉我应该学Emacs,并且给了我他的配置文件。我又花了几个小时学习基本的Lisp语法,以便我能自己设置配置文件。

  然后一个人从我身边经过,看见我正在使用Emacs,就问“你怎么还在用Emacs(表情自行脑补),你不知道Vim更好吗?”我想“呵,Vim”,于是我开始背诵Vim成堆的键盘快捷键。

  工程师们经常讨论这样一个话题,文本编辑器哪家强?并且,工程师们将这看成是一场宗教战争——评判的标准不在于客观的准则,而在于历史分歧。

  那时候,我认为如果我打字越快,我编程的速度也会越快。所以我抛弃了传统的键盘布局,用上了程序员必备的Dvorak键盘布局(就像下面这样)。客观上来说,对程序员而言,这是最高效的一种键盘布局。

  看着上面的键盘布局,你能告诉我有多少字母键,数字键,特殊字符键的位置没有变动吗?答案是个位数。

  等我能够成功启动Linux,一分钟能够敲出十个单词的时候,我开始通过看书和Udacity的课程学习Python。

  经过七个月的艰苦奋战,我得到了第一份软件工程师的工作。

  CTO面试我的时候,我告诉他所有我学过的工具和我正在使用的高大上的配置文件。CTO礼貌地听我说着,时不时点点头。等我吹嘘完自己渊博的知识之后,他看了我一眼,然后说“其实,大部分事情都有很多解决的办法,但是只有其中的极小一部分是有意义的”。

  四年以前,我所在的公司决定使用Ruby on Rails构建他们的产品。对于语言的选择,所有的工程师都没有意见,现在,他们的许多原始代码还在工作。所有的工程师都用MacBook,因为MacBook不仅可靠,并且和他们在产品中使用的Ubuntu Linux服务器非常类似。这里的工程师不讨Vim和Emacs哪家强,每个人使用的文本编辑器都是RubyMine,这是一个强大的集成开发环境,默认配置非常好用。这里的每个工程师使用的工具完全一致,意味着每个人可以随便挑选自己的座位,然后立马和左边或右边的同事开始结对编程,而不需要纠结开发环境的配置问题。使用完全相同的配置能极大地方便两个开发者之间的合作。

  虽然我不会Ruby on Rails,公司也觉得我能胜任工作。因为我会Python和Django,并且赢得了黑客马拉松的比赛,公司认为这些可以说明问题。

  最开始的几周真是艰难,这种艰难不仅仅来自于我来到一个新的团队,使用一种新的语言,新的框架和新的代码库,而是因为我发现身边的人都是以一种自虐的态度在学习编程。

  我独自在图书馆、咖啡厅坐了几个月,每天就是盲目的通过命令行安装各种工具,调试Linux驱动,解决一些细枝末节的问题,比如说括号不匹配。我涉足每一个能想到的在线课程,报了无数的MOOC课程。我认为实际上我什么都没学到,直到在某个月的考核中,我上升至第五位。这些经历给我的印象是,编程是一场你永远无法取得胜利的战斗。我开始明白那些看起来正常的程序员他们的过往实际上是那么灰暗,他们经历过太多,又压抑得太久,不得不说,学习编程简直就是一个反社会的活儿。

  辞掉上一份工作的第一个周末,我上传了这张自拍。那天我起了个大早,穿了件体面的西装,穿西装是为了提醒自己:我可是要去学习编程的人。Facebook的标语“我的新办公室——餐桌上。我每天过着朝8晚6的生活,只有在必须要休息的时候才休息”。在生活中,我学程序员说话,像他们一样思考,现在,我已经习惯了这个词。

  我的同事几乎从没遇到过语法错误,因为他们的IDE替他们解决这个问题。而当他们遇到一个错误信息,如果在几分钟内不能解决问题,他们就会给其他同事发送一条即时消息,请求其他人的帮助。他们会随意跳到别人的桌旁,然后开始结对编程。这里的程序员不会太自我,也不自诩为精英。他们也不认为编程是一件痛苦的事。有的只是成年朋友之间的建设性的对话。

  一个团队中的成员使用的工具是高度一致的。在Passion Project和黑客马拉松中,开发者可能会使用新的JavaScript框架,比如说Angular.js。而在一个真正的团队里,成员把精力主要放在使用现有的技术提升产品之上。从这个角度来说,他们是保守的。

  在ThoughtBot你也会看到类似的情况,在ThoughtBot中,每个人都坚持使用一个小且高效的工具集(Rails,Vim,Postgres和Redis)。因为工具集小,所以工程师容易成为该领域专家,又因为每个人使用的工具集都是一样的,所以相互之间进行互操作就变得很容易。

  所以真正的问题是,如果高效的团队在使用一个小且固定的工具集的时候最高效,那么是不是人们在学习编程的时候使用一个小且固定的工具集是最好的。那些在线编程课程和编程训练营显然是这么想的。

  但是作为一个个体,可以选择的工具那么多,真的很难决定到底该怎么选。我知道这一点是因为我经历过。一个好的程序员的技能集合可以用T形来表示——涉猎的领域很多,但是真正擅长的领域不多。但是,经过经年累月的积累,T形将会慢慢变成下划线形。

  我遇到过许多学习编程的人,上来就想什么都学,什么都会,最终,他们都失败了,放弃了他们成为一个程序员的梦想。我不想这种情况也发生在你的身上。

  你需要专注更多方面

  事不宜迟,下面给出一些新手容易犯的大错误:

  • 从这种语言转到那种语言,又从那框架跳到这个框架,或者骗自己可以精通所有的语言或框架
  • 使用小众的工具来搭建自己的开发环境,而不是选择传统的、可信赖的工具。
  • 学习像Docker和Famo.us这样的工具,仅仅因为它们新奇,虽然更加基础的技术都还没掌握好。

  如果非得用一个词来总结我的建议,我会说:专注。

  我问你,你会用专注这个词来描述你的编程学习计划吗?如果你认为你的计划够专注,好,你现在可以停止阅读,回到你的计划开始学习,因为我不想说任何可能导致你失去专注的事情。

  如果你还的计划不够专注,那你也有福了——照我说的去做,你也能专注,但是这需要花费你几分钟的时候做几个艰难的决定。等等,你们别走啊!

  好的,你还没走。下面就是你需要做出的艰难的决定。

  1. 选择一种软件类型,可以是Web应用,手机应用,游戏,或者嵌入式。我推荐web应用,因为它够灵活。学习的资源也很多,工作机会更是数不胜数。如果你的兴趣点不在web应用上,关掉这个页面,在Google搜索框里面输入“getting started in _____ development”,将返回的结果一条条点进去看。
  2. 选择一种编程语言:JavaScript,Ruby或者Python。每种语言有自己的强项,都有与之相对的用于构建web应用的工具(分别是Node.js,Rails或Django)。除非你自己明确知道自己该学哪种语言,否则我推荐你学习JavaScript,因为它使用最广泛。
  3. 选择一门在线课程。这里有一些选项供你选择:如果对JavaScript感兴趣,去FreeCodeCamp.com或者NodeSchool.io上找;如果对Ruby感兴趣,去TheOdinProject.com或者TeamTreehouse.com上找;如果对Python感兴趣,去Udacity.com上找。相信设计这些课程的老师们的智慧,按照建议的顺序完成这门课程,不要跳来跳去。
  4. 买一个新的/旧的MacBook,或者在你现在的电脑上安装Ubuntu Linux。至于其他你可能需要的工具,按照在线课程的建议安装即可。

  一旦你做出了这些决定,剩下的路就太简单了。你只要保持清醒,不要被周围的新工具所迷惑。一周七天,每天学一点在线课程,哪怕一次只有半小时。相信你今天做出的决定。最后,请记住:只要有耐心,任何能干的人都能成为绝世coder,当然也包括你。

时间: 2024-11-05 23:35:49

一个很有借鉴价值的编程故事的相关文章

一个很有借鉴价值的编程故事(转)

英文原文:A Cautionary Tale of Learning to Code 这是一个真实的故事,关于我自己的.一个理智的生命个体是怎么一步步走向疯狂? 我穿着西装,坐在办公室里,脑子里有一个模糊的创业想法.然后,我决定学习编程.我曾经无意中听到过几个人在那吹牛说自己怎么使用一种叫 Ruby 的语言轻松实现自动办公.我想“呵,Ruby”.我回到家,谷歌 Ruby.15 秒之后,我随机选择了一个 Ruby 教程,开始学习. 一周以后,我参加人生中的第一次黑客聚会.在场的每个人都在讨论什么

WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]

原文:WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇] 在<上篇>中,我通过使用Delegate的方式解决了服务调用过程中的异常处理以及对服务代理的关闭.对于<WCF技术剖析(卷1)>的读者,应该会知道在第7章中我通过类似于AOP的方式解决了相似的问题,现在我们来讨论这个解决方案. 通过<服务代理不能得到及时关闭会有什么后果?>的介绍,我们知道了及时关闭服务代理的重要意义,并且给出了正确的编程方式.如果严格按照上面的编程方式,就意味着对于每一个服务调用,都要

WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]

原文:WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇] 在进行基于会话信道的WCF服务调用中,由于受到并发信道数量的限制,我们需要及时的关闭信道:当遇到某些异常,我们需要强行中止(Abort)信道,相关的原理,可以参考我的文章<服务代理不能得到及时关闭会有什么后果?>.在真正的企业级开发中,正如我们一般不会让开发人员手工控制数据库连接的开启和关闭一样,我们一般也不会让开发人员手工去创建.开启.中止和关闭信道,这些工作是框架应该完成的操作.这篇文章,我们就来介绍如果通过一些编程技巧,

[搬家from qzone] 我不是一个很好的学长,所以毕业前,给学习学妹们写写自己犯的错误吧

本人刚刚毕业,晚上的的时候听mm扯南操上的猥琐男传闻.额.....忍不住蛋碎一地,于是乎想想自己从刚大一走到现在遇到的各种各种,现在还是写下来,算是给学弟学妹以及还没入校的学弟学妹们留点东西吧.算是跟大家扯扯前面有多少坑,努力少掉下去几回,嗯.当然,有的坑,很有可能掉下去就...嗯,我们班目前:一个把自己扔进西湖再也没出来,一个吃了八片药然后被救起来了,劝退一个,挂到退学两个,留级退学一个,留级没退学的还两个.现在想想我还安全的毕业了,还是很欣慰的~ 想必所有人在大一都热血沸腾过,都用好奇的眼光

第一次作业:假装这里有一个很响亮的标题

---恢复内容开始--- 一.结缘计算机 缘分可以说是一个很奇妙的东西,喜欢一件事物往往从对它的美好幻想开始.相信许多人想到计算机都会将它与玩游戏联系在一起,对于我却不然,在我看来编程是一个创造的过程--这就是我对于计算机最初的美好幻想.试想通过编写一些代码便能够实现自己心中所想,这难道不是一件令人兴奋的事吗?它执行你的指令,完成你的任务,实现你的想法,这在当时是对我非常有吸引力的,于是我第一志愿便填报了计算机专业. 你认为你的条件如何?其实我并不知道这个问题应该如何回答,物质条件?素质方面?条

Mybatis_reveiw之Mybatis官方的一个很简单的Demo

上学的时候,一个老师讲了个故事,这个故事的大意是,我们有很多种方式去削苹果,第一种方式,使用指甲刀,第二种方式,使用机床,第三种方式,使用手摇的那种削平果小工具.我们当然都能够完成这个简单的需求,但是使用指甲刀削出来的苹果一定比较坑坑洼洼,不够美观,而且可能会让人感觉到有点没啥食欲.使用机床呢?可能会造成大量的浪费,原本一个美观大方的苹果变成了只能啃几口的正方形.第三个,因为是专门为了削苹果皮而设计的,理论上是最合适用来解决削苹果这个问题的解决方案. 一个好的架构,其实要做的事情是非常简单的,除

一个很不错的bash脚本编写教程

转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用.所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在 bash的大姐,bourne shell中运行). 如同其

一个很实用的前端框架Zui

杰哥给我推荐了一个很有用的前端框架-Zui,我看着觉得很神奇的,因为有很多我都不懂.在这里分享总结一下.首先,这是一个中国自己开发的框架,比起很多外国的框架来说,有很详细的API,而且是全中文的,不需要再经过其他人的翻译了.然后,它的内容十分丰富,很系统的分为了:基础,控件,组件,JS插件,视图几大块:而且使用起来,只需要导入js,在适当的地方加上正确的class类就可以了.对于,没有什么js基础的人,也是十分容易上手的.下面我就大体的介绍一下它的各个模块的功能.基础:基础里面我觉得很有用的主要

Go map中一个很重要的特性

先看一段代码: func main() { m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = "c" for k, v := range m { fmt.Println(k, v) } fmt.Println("-----------------") mm := make(map[int]string) mm[1] = "a" mm[2] = &q