这种问题好像实在太老太老了,但很想再问问。 能详细地讲讲,你们是如何,从刚刚接触到编程,接触到的是什么,怎么做,然后如何一点点提升(或快速提升),至今日的境界吗? 为什么我总觉得脑子里全是碎片,然后没有融会贯通的感觉呢?
#10 楼 @chairy11 要是有方法的话就不叫顿悟了啊
以上为玩笑 :)
还是要多动手吧,一个问题一个问题地去解决,然后不知不觉中就成长了。
拿我自己为例吧,几年前,那时我完全没有接触过 iOS 开发(只是有几年 PHP web 开发经验,C 和 C++ 算是会,但是没真的写过代码),然后一个朋友把一个 iOS 外包的单子丢给了我
项目的框架代码从他以前的一个项目里面直接拿过来(已经是可编译运行状态),然后接下来的都要我自己做
刚开始两周,只有几个简单的需求过来,于是我多半时间都花在这里改改那里改改看会发生些什么 -_- 遇到的各种问题,基本上都可以在 stackoverflow 和官方文档里面找到答案(问题都太常见了,甚至我都不需要自己提问,直接搜索就 OK);中间还走了不少弯路,比如没有把 Obj-C 的语法文档看完,到后来才明白 selector 是怎么一回事……
再接下来需求逐渐多了起来,更详细也更复杂,也就只能慢慢地去实现了;这时写代码或者重构代码的时间渐渐多了起来,查 google 的时间相对减少了。
然后后面有几个比较复杂的需求,涉及到一些动画,于是又看了不少相关的资料,最后实现了(然后甲方改主意,这个需求被砍了……)
一共大概花了三个月,项目结束,在 app store 上架。于是我终于可以说我会写 iOS 应用了……(但是其实后来才知道要学的东西还有很多很多)。
不知道 10000 小时定律,是怎么得出来的, 为什么不是 9000 小时,或者 14000 小时? 另外,很多时候,看起来的小领域,进去了发现是个小宇宙。 1w 小时哪够?
同问,产生了太多的知识碎片,怎么办才好
提供一个权威的答案,《编程大师访谈录》书中盖茨讲述了他的经验,就是读代码,他如果面试的话会给两页代码让应试者读。
可以参考一些书籍比如 Ruby 相关的《Matz 的程序世界》,我比较喜欢的一本书微软专家写的《编码》,讲了 cpu 的原理,科普书很有趣。
《功夫熊猫》这个电影其实很有启发意义,最重要的恐怕就是喜爱了。在高手透关的时候,口念 inner peace,也就是需要静下心来,让答案自己浮现。
我讲一个最近的体会。前几天我听了 Rubyconf 的一些内容,看着 youtube 的那个自动翻译的字幕听的,多少听懂了一些。
今天听一段 ted 讲座,我感觉似乎能听懂一些句子了,以前基本上只能听到一些单词。
如果我直接听英文,听不懂会觉得很无聊,那个字幕还是起了作用的。我觉得要选符合自己水平的学习材料,逐步提高。
#21 楼 @zealinux 可能是这本书吧?一万小时天才理论 http://book.douban.com/subject/4726323/
想说几点
新手自学编程,有两点误区:
1)不会抓主干。打个比方,新手喜欢看别人推荐的“好书”,“先抓主干,再理枝叶”是学习的正途,《Effective C++》之类是好书,但它们都不是用来入门的,为什么?因为它们不是主干,语言实现细节和各种坑你都了解了,碰到实际问题依然用不好 C++。大多数技术细节其实高手也不清楚,更不用说新手了,你把 Rails 开发的主干抓好,细节地方就查 Guides。
2)不会看 log,不会调试程序。出现了 bug 配置半天,改半天,耐心耗尽,更不容易学了。这个没办法自学,你可以网上搜一下别人如何进行 debug、看 log、调试程序的视频资料。Rails 圈子里的学习资料其实对新手非常不友好。
最好的方式,还是找个 IT 公司边实习边学吧。
流水账... 2008 左右,高二,学校上过 VB, 会做课上的题目 09 上半年,高三,同学买电脑报,我几个月厚脸皮去借看,大学自己买 高考结束的暑假,自己家有电脑,从此假期都宅着上网 (悔了..) 大一,到学校渐渐空的时间都到学校机房上网,浏览新闻,很想抓时间, 其中一部分时间开始倒腾 Linux, 参考怎样成为一名黑客开始了解 HTML/CSS 还有就是不喜欢上的课会从学校图书馆带本什么脚本语言或 Linux 相关的书去凑合.. 大二,买笔记本,装卸装卸 Ubuntu, 同时开始用 CSS 写一些简单 Demo 学校大二教 C, 止于做题。自己觉得 CSS 不够用,开始学 JS 忘了什么时候接触的 CoffeeScript 和 Git, 总之上道了,接触 Node 后基本定型 也开始刷知乎,在知乎问什么语言最漂亮,慢慢积累对 JS 的怨念... 对 Haskell 产生兴趣 大二结尾进了学校网络社团,后面跟着他们学管服务器.. 大四同学寝室里网店火热朝天,就赖社团办公事去了.. 免费上网.. 快车道.. 后来每天变成刷 Hacker News, 做 Demo 刷 GitHub.. 刷 Node 之类的. 13 年,三月份找到实习,于是 Backbone 和 Chrome 开发工具开始长期深入.. 七月份换 Macbook, 从此围观 Linux 社区,折腾系统的精力和机会砍掉了 下半年,学长指出基础太差,于是跟着他学了点 C 和 C# , 又自学 Go 到入门.. 今年 Vue 框架出来以后果断跟进.. 终于能写自己可以用的东西了.. 大部分时间是在 CoffeeScript 死磕,最近还跟 CoffeeScript 译者死磕..
在公司里有次吐槽,结果大家都说到本来就想做点东西,结果掉进了 JS 大坑 大学时光专心学什么都会改变一个人,但又想不清楚到底值不值 去年在杭州公司里来了个设计,突然先很聊得来,就看着对方做 PS 什么的.. 细细想,其实我学编程和他想用设计改变世界,心态上出发差别并不大 包括到上海后,公司的设计嚷嚷要学编程 - -! 这坑可比 Sketch 难爬多了.. 跑题...
楼主关心怎么融汇贯通,没有融汇贯通但最近有一些心得: ...可信度参考我的 SF 积分 (减去大部分靠提问得的)..: 我觉得每个接触的领域前期的积累,都是想到什么,乱搜一通,学会一一问题解决 很多是从编程以外的角度思考问题,但靠这样乱冲乱撞把前期的基础积累起来 积累到一定程度之前,写什么代码都会遇到问题,导致没法从其他角度思考问题.. 积累很多之后,基本问题减少干扰了,才能从高一点的层度理解问题
脚本语言 (静态类型不懂..不考虑..) 我觉得重要地方有几个:
对先做什么后做什么的流程进行理解,用函数和模块对重复的代码进行抽象化 目标是代码清晰,修改方便,不易犯错... 最最重要的是:降低开发和维护的时间成本 我想是"整洁", "严谨", "优雅"等等都是从时间角度去衡量的
一般是面向对象说到的,分清每个组件的指责,做什么应该在哪里做 程序要对现实中的问题进行模拟和计算,重点是控制住这层模拟的复杂度 但是人们大脑并不擅长面对复杂事物,直接的方式就是拆分成各个组件和模块, 每个组件处理好核心的问题,相互之间协作的消息机制也处理好..
编程语言可能有换的机会,语言功能有可能更新,但是解决的问题才是重点 重要的是有个解决问题的方案,然后这个方案用合适的代码的模拟, 整体的解决问题的方案清晰,代码可能写得乱,但修改代码比修改架构容易得多得多 至于解决问题的方案...具体问题具体分析,当然也要满足代码的一些规律: 问题应该可以被分解成小问题,小问题可以落实到一段简单的代码来解决, 最好其中很多小问题社区已经给解决掉了...
我觉得编程语言很大程度上是人类对于硬件世界的折衷.. 做设计和研究的人才有意思 因为后者可以更大程度关心问题怎么解决,而编程还要操心这工具怎么用.. 问题是工具怎么用,, 那不就是死记硬背或者花钱买更好的服务吗,发挥空间很少啊
#37 楼 @jiyinyiyong 谢谢,这么详细,感动 ing... #36 楼 @whitecrow 谢谢,接受你的建议… #33 楼 @diguage 恩……我感觉也是。其实我前阵子拿出来想重看一遍的,但一看到目录里设计模式文字编码什么的,就觉得,好吧,还是先不看了……
俺学 rails 是这样的....
在学习的路径上我非常同意 @jiyinyiyong 说的,关键是如何解决问题,寻找和学习解决问题的思路和方法。什么时候什么场景适用什么技术方案。知道一个问题怎么解的时候,写程序就是一个水到渠成的事情了,平时不用太过于纠结细节,细节永远是在实践中完善的
我读书的时候在学校建暗黑服务器,只能从源代码编译,没办法,只好学习了 linux 和 c,融会贯通的感觉一开始比较难有,等你解决完很多问题以后就明白了,"看代码看数据的组织形式"
大一跟学校学 java,js,C#。那时候对游戏感兴趣就跟着网上教程做了些俄罗斯方块,贪食蛇等等
大二苦读书,什么《thinking in java》《java 核心技术》《CLR via C#》《C#基础入门》等等,读了一堆凶器(厚的能砸死人),然后凭兴趣去接触了WP7,WPF等等,顺道做了点不入流但对编程技术有锻炼的小游戏和小软件。
大二下接触 ruby,三观颠覆,决定当个 ruby 程序员。于是去学了 rails。
因为我上的专科,之后就是实习生活直到毕业了
关于融会贯通,还是要多读书多写。如果不是 IQ250 的天才少年,估计单靠自己的理解还是很难的,多读书,多读基础的书有助于你理解编程这个事情的本质。让你把‘编程’这一行为的本质和语言的实现从不同的编程语言和技术中‘抽象’出来。以后你在看到什么新奇的技术或者技巧,会反射性的洞悉其原理,这样我觉得就是做到融会贯通了。
要去努力理解‘编程’,行成自己的编程世界观。你写的每一行代码,调用的每一个方法,你都可以想象他背后做了哪些事情,而不是当成魔术一样。那样就需要你总结编程中的基础规则,所有的‘魔术’也都是在规则之下的组合变幻,当然这个规则最基础的就是‘语法’。
多接触有趣的技术,避免成为井底之蛙。多接触也是多理解,多理解不同的技术才能看到他们的共同之处。
入门语言,语言对于编程的理解还是有影响的,因为每个语言的行为不同,而你是通过语言来与计算机交谈的,语言在编程中和程序员是最亲密的,理解编程刚开始也是通过语言来作为桥梁。比如 C 和 ruby 中,char str[] = "hello world"
和str = "hello"
这两句话在你用不同的语言时其意义与背后行为也是不同的。所以要多尝试以不同思维来接触不同语言。不过入门语言倒是无所谓。
#48 楼 @whitecrow 我之前自己建了个自己的博客,后来老不更新,后来自己撤下来了,最近我一直在总结自己这些年的经验,感觉有些东西还是对新手有帮助的,挺愿意和大家分享的,欢迎随时和大家交流,家里最近比较忙,过段时间我会把博客再开起来
找技术一流的团队加入。所在团队的水准对于新手而言非常重要。
没有快速提升的捷径,但是通过额外的努力(比如做工作外的项目,或是投入到开源社区中),提升的效率更高。