×

Loading...

【精华】IT 入门攻略 (8) 码感

本文发表在 rolia.net 枫下论坛俺在第一篇就说过,有码感的人,做码工容易入门,做起来也轻松。但是什么是码感呢?一个初学的人怎么知道自己有没有码感呢?

俺想用自己 n 年前在加拿大上学时第一次编程的经验来感性的解释一下码感。

俺在大学本科时就对计算机有兴趣,当时想转到计算机系,可惜学校不准。报研究生的时候,俺又想报计算机系,可惜当时没有一个学校的计算机系愿意接受本科不是计算机的人。但是因为俺不喜欢自己的专业,大学成绩也不好,所以俺还是下定决心自学计算机课程,通过计算机系的研究生考试,不过报的是管理系。当时国内管理系刚刚开始,本科毕业生少,所以报管理系的研究生,通过任何系的考试都可以。

有点出乎俺的意料,俺竟然通过了考试,而且成绩还不是太坏,因为俺被录取了。

俺说这些,不是人老了就喜欢吹牛,而是想交代一下俺的计算机背景,让大家对俺下面的例子有一个客观的认识。

虽然俺自学了计算机课程,但是俺除了本科写过 FORTRAN,对编程基本上是没有经验。来加拿大的时候,初生牛犊不怕虎,投简历申请码工的职位,号称自己有 excellent understanding of Object Oriented Programming principles,其实俺是后来上学以后才明白什么是 Object Oriented。当时俺对 objects 只有朴素的理解。

上学的时候俺喜欢在网上打桥牌。这个桥牌程序叫 ok bridge,是当时功能最强最流行的桥牌程序。打牌的人可以来自世界各地,任何人都可以围观,同一桌的人可以讨论,跟现在的 group chat 一样。打了几次,俺觉得有几个功能没有真是很不爽,所以有一次打牌碰到该程序的作者,记得他叫 Matt,俺就建议他加上这几个功能,没想到他竟然没有理俺。

当时俺的小心灵很是受伤。无奈自己不懂编程,这口气只好忍了。

后来牌打的越多,俺越是觉得这几个功能非有不可。有一天俺突然想,俺要把这几个功能自己加上。

这个桥牌程序是用 C++ 写的,操作系统是 UNIX。俺当时 UNIX 已经很熟了,C++ 没有玩过,不过可能看过一两本书。俺下载了这个程序,google 了在 UNIX 上编译 C++ 的方法,试了几下,没想到竟然通过了。当时俺是异常地激动,因为这就意味着俺可以对这个程序任意修改了。

那个桥牌程序很大,功能很多,比如它有牌室,一个牌室可以有好几桌牌,你可以开桌子,可以邀请人,可以把人踢出场。虽然程序很大很复杂,找到跟俺要的几个功能有关的代码并是很困难。虽然俺当时不懂编程,照骷髅画瓢,加上连蒙带猜,俺硬是把这几个功能实现了。

俺兴高采烈的把俺的新程序寄给了 Matt,没想到他还是没理俺。不过后来他自己把这些功能都加上去了,虽然跟俺的做法不太一样。

回到俺这篇文章的主题,什么是码感?这就是码感。如果你没有什么编程背景,能下载一个比较大型的 Java 程序,在 Eclipse 里捣鼓捣鼓,能编译,能运行,能加几个功能,如果你不觉得难,不觉得吃力,没有花太多时间,不需要别人手把手地教你,俺觉得你就是有码感。这个过程肯定有卡壳的时候,但是卡住了,你自己能解决,或者 google,或者问人。

当然码感也有差别,有些人码感很好,有些人码感一般。码感很好的,花的时间就少。码感一般的,花的时间就多一些。俺觉得,做码工也许码感一般就足够了。码感太差或者一点码感都没有,可能就会很累很痛苦。

虽然卫道士们不喜欢听,俺改这个桥牌程序,跟现在大部分码工大部分时候上班做的事情并没有什么两样。俺当年在毫无编程经验的时候就已经有能力做码工,俺相信所有码感好的人都有这个能力。更多精彩文章及讨论,请光临枫下论坛 rolia.net
Sign in and Reply
Modify
Report

Replies, comments and Discussions:

  • 工作学习 / 事业与工作 / 【精华】IT 入门攻略 (8) 码感
    • 文不对题。你这不过是谈了一点动手能力,和什么感不感的扯不上。 现在哪行哪业,有点成就,没点成就的,都在说干俺这行你得有感觉。
      • 不敢苟同啊。没有码感人生地不熟的怎么能找到路~~~
        • 找别人的code,不过是猜测,推理,和锲而不舍。
        • 码感是可以通过学习得到的,古人有曰:“读书破万卷,下笔如有神”。。。多年前,听别人讲解DESIGN PATTERN的时候如听天书,现在发现我给别人讲解DESIGN PATTERN的时候,别人也是一头雾水,多读多练的结果而已
          • Design Pattern 其实都是忽悠人的东西. 不少的pattern都是对前期design的设计不足的弥补.
            Design pattern 东西核心思想就是封装变化点, 仅此而已.
            哪里有变化, 哪里就有封装. 面向对象有时候蛮扯的, 特别是这个 design pattern , 对象绕来绕去的, 最后转了几个大圈才到核心的代码. 说是为了适应后期的需求变化.如果有可能我还是喜欢用 functor 组合上 booost 的 bind. 那样才拳拳到肉!
            OO 核心思想, 个人认为最重要的就是 封装. 啥继承 多态的 几乎都可以扔掉!
            就算用 C 语言 , 我一样可以实现OO来! IT 行业确实没有啥. 就是那句话: 人少 钱多 速来!

            个人意见, 如有不当地方! 欢迎批评指正! ^_^
            • 继承和多态有啥问题?
              • 继承就是个贼船上去了就下不来了! 耦合太紧! 不提倡继承,多态也可以不要了! ^_^
                • 说实话你就了解了个名称就发言,理解完全和OO概念设计理念相反
                  • 谁规定的我了解几个名称就不能发言了? 哪条法律说我了解几个名称不让我发言了? 如果有这样的规定, 那我就闭嘴! ^_^
                    • 我说你不能说吗?我只是说你的理解和设计相反
            • 要不你也总结个什么设计理论, 看看微软和SUN会不会把你的理论放在他们的网站上?
              • 我是比较无知! ^_^ 你说对了! 向伟大的C语言致敬! 不要太迷恋专家的说法! 怀疑一切马克思说的! 呵呵
                • 不同语言和实用场合不同,如果有人用C来写现代商业软件,肯定是疯了
                  • 朋友 我只是说对于 OO 的理解, 就算给你用结构化语言, 你要是对OO理解好了, 一样可以实现OO的实现来!
                    这个要看东西给谁 用? 就算给有的人 OO 语言, 但是他的实现 还是结构化语言的实现. 相反给有的人结构化语言, 人家一样用O当O的思想去实现思考.
                    好的东西看给谁用. 机关枪可以当片刀使唤. 片刀用好了也可以达到机关枪的效果! 是不?
                    • 义和团确实可以杀几个洋鬼子。
                  • 哥们儿, 我个人认为学习电脑语言, 主要是学习它背后的思想.!
                    至于实现去google 就好了. 我上面说的意思是说, 如果理解透彻了OO 思想, 即便是给个非 OO的语言, 一样可以写出来 OO 的味道来.
                    真的是it 开发人员, 普通的语言 2-3 天足够了, 然后 copy paste 就可以干活儿了. 毕竟很少有单位的开发让你从头写代码!
                    • 光有思想,不知道如何实现也是空谈,DESIGN PATTERN解决的正是这个问题。不理解的情况下用网上面搜来的代码做出来的只是一堆乱麻,维护性极差,如果只知道C&P,读别人的代码可能花很长时间才敢下手解决问题。
                      花些时间读读专家的书比想当然肯定有帮助,IT理论可能是相通的,但是IT市场不一定是相通的,你可以用C写出OO来,但没人会雇佣你来做这种事情
                      • 我说用 C写出 OO 来, 是看看开发人员到底明白不明白 C++ 背后的多态的实现机制!
                        C++ 里面的多态 继承啥的特性 只不过是 编译器给你自动实现了. C 可以自己实现 , 但是我想说的核心是说 用 C 来实现多态可以具体考量一个开发人员知道不知道 C++ 编译器 背后实现多态的实现机制, 这样更好的有助于理解OO的多态 继承 啥乱七八糟的东西. 仅此而已!

                        BTW , 对于本人来说我水平比较浅薄, 但是偶一般经常混迹于北美的IT行业, 经常换工作. 一般对于一个系统的熟悉, 基本上就是 2周到3周. 而且系统肯定不小, 基本上都是上百万级别的code. 熟悉系统本人观点就是 , 要先了解big picture. 了解系统大框架, 其他细节东西, 具体要干活的时候 再了解. 知道他怎么work的大框就可以了.
                      • 再说说关于读代码的问题, 那么大的系统 , 个人意见, 代码不是读出来的. 是run出来的!
                        再说说关于读代码的问题, 那么大的系统 , 个人意见, 代码不是读出来的. 是run出来的! 知道大概框架, 然后run it . 加log 信息. 这个比单独死扣代码看,效率要高很多. 至于您说啥不敢下手改动别人的代码. 这个别人我就不清楚了. 反正本人干活的时候 基本上都是 2 or 3周就开始改动代码了. 有的小的系统 即便是不熟悉的语言, 本人 2周 就可以 commit code 了. 时间就是金钱啊! 资本家雇偶是按照时间算钱的. 嘿嘿 所以不及时出活儿, 偶的饭碗不保啊!
                        • 说实话,你说的这些只说明你是个熟练码工,我真没兴趣讨论技术问题,因为这不是我发贴的目的,我对别人是否是技术高手不感兴趣,还是我那句话,优秀的代码在项目成功中所占比例不到10%,所谓码感或者你骄傲写码能力只是多练习而已,不要陷入代码不能自拔
                          • 你可能是做应用的项目经理,觉得做技术的码工就是一熟练工人,其实在你观察到的天空里也是对的,但是真正的高科技公司,靠人才来竞争的,你觉得不重要的码工可以做到合伙人级别,不过不在你能观察到的天空里了。
                            • 我确实不属于天才,一个在公司里写些应用程序的平常人而已,你说的天才离我很远,讨论一个离我很远的天才是没有意义的。能传授下你是如何成为合伙人的?让俺开开眼界
                              • 人家的意思是说有可能成为合伙人, 不代表人家做到合伙人!人家说人类能上月球, 你偏说你上去过吗? 这个不make sense吧?
                                • 既然他非要搞个合伙人来抬,我只好顺着一起抬了,难道只有你能抬?
                                  • 哥们儿, 说实话我真的木有看出人家字里行间有抬杠的意思! 倒是您貌似说着 说着要鸡眼的样子! 要是为了这个生气, 我都替您不值! 嘿嘿
                              • 哥们儿, 好好说话! 抬杠就木有意思了吧? 心平气和一点. 虽然我很菜, 但是我这个人奏是心态好! 这点你还真的像我学习 学习! ^_^
                                • 你本来就是显摆,真没觉得你的心态好
                                  • 好吧! 你说我显摆, 我就显摆吧! so what ? 你咬我? 那您牙口可要好一点哦! 别像公鸡似的, 逮谁跟谁来劲!
                                    • 你的心态真好,lol
                                    • 那么牛,能给大家说一下JAVA 8中的lambda expression如何用C++来实现,Scala也实现了,不过blackberry用了以后。。。。。
                                      • 这个问题最近正好有在看
                                        三者的实现方式很不一样,暂时最elegant的是JDK8,毕竟有JVM这个大神器在,一切的优化都可以在这个搞定。
                                        但是其实C++标准(C++11)比JAVA早有这个,Scala是写起来好,编译后比较臃肿,毕竟JDK6不原生支持这个语法,scala核心团队有讨论过看JDK8流行程度会改scala的编译器

                                        C++的看这个:http://www.cprogramming.com/c++11/c++11-lambda-closures.html

                                        JDK8 和 Scala 看这个 http://www.takipiblog.com/2014/01/16/compiling-lambda-expressions-scala-vs-java-8/

                                        其实自从C++为了赶潮流加了不少新特性之后,有点不伦不类了。早期的高性能被新特性拖慢了,而且新增加的负责性对开发帮助不大,靠那么几个牛逼库来
                                        很多老手都宁愿用C 套object概念做东西,好例子是FREEBSD和NGINX
                                      • 您是问我吗? 如果问我的话, 那么我要声明一点, 我从来木有说我牛! 我的帖子都说我的个人理解!
                                        好吧. 说说你的 lambda 吧! 还是个人的理解, 正确与否 不敢保证! C++ 新标准里面提供了 lambda! 这个是我非常心动的一个特性!
                                        有了 lambda 那么对于像控制内存泄漏, 还有资源的释放来说, 简单到了脑残的地步! 还有lambda 应用到 C++ 的stl 的话, 就更如虎添翼了!
                                        起码节省了不少自己构建啥 functor 这样类似的object了! 还有有了 lambda 貌似 C++ 也可以往 functional programming 上靠近了不少.
                          • 优秀的代码占多少比率对于我这样的菜鸟我是不关心的. 我关心的就是我付出劳动你给我多少钱?
                            优秀的代码占多少比率对于我这样的菜鸟我是不关心的. 我关心的就是我付出劳动你给我多少钱? 其他的对于我这样的人来说, 我根本不care.
                            我的目的就是干活儿 , 拿钱, 走人! 你说啥设计啊 便于维护啊! 我都同意. But so what? 原来代码就是一坨屎, 难道让我去重新design? refactor?

                            我想木有哪个项目经理去让你干 refactor 这种出力还不讨好的活儿的. 对于项目结果看不出来有啥变化, 但是还要承担改动的后果! ^_^ 我要是项目经理
                            我也不会那么干的. 另外, 关于公司前景如何? business 如何? 跟我木有关系, 好了 我就多待几天, 不好 咱就走人! 我的目的就是赚钱, 其他的在我眼里面都是扯!
                            谁叫咱人比较俗呢! ^_^
                          • 你还说对了. 我奏是个熟练的码工! 我劳动我光荣! ^_^
                        • 2 or 3周才开始改动代码,是不是慢了点儿?特别说明一下,这是问句,不是反问句。我当时组里面有个印度姑娘,Senior,安排到新系统,新框架,新语言,一个多礼拜也没出什么活,我就没再给她机会。我的要求是不是太高了?
                          • 得看具体 task 吧。
                            • Java 程序员。Camel, Groovy, Spock, 写hibernate mapping +test case.
                          • 是你招她进来的吗
                            • No。
                          • 个人认为, 对于一个90年代出开发的代码, 而且里面有n多的不用的代码的话! 最少需要2 到 3周的时间!
                            我不知道你们用的是什么环境(Maybe Java 的开发 或者 C# ? ). 我工作的地方 1 code 是老的比我 爷爷岁数都大的代码(开玩笑) 2 在系统的repository 里面有很多以前用的 , 但是现在不用的代码也放在目录里面. 3 有很多的ticky 的解决方案在里面 (因为有很多原先 C的 跟 现在的 C++ 的代码 搅在一起)
                            对了 忘记说了 我们的环境是在 linux or unix 下的 C C++的 client server 应用代码的开发.
                            起码就那些不用的dead code 放在目录底下, 当你浏览代码的时候 就够误导人的了! 所以又不得不回去看看具体的make file , 来figure out 到底哪个代码再使用, 哪个代码不用.

                            BTW , linux下面有很多的 third party的东西, 起码还要花点时间知道 这个东西是什么? 要干什么? 系统为什么要用它?
                            当然每当这个时候, 我就非常希望用Java 这样的糙 快 猛的东西! 毕竟 Java的 工具 比 C++不知道多多少阿? C++ 除了现在
                            很风行的 boost lib 之外, 其他的可用工具比较少. 起码open source的东西 要好好的评估一下才敢用. 嘿嘿.
                            • 很理解。老,旧,大的系统维护起来不容易。我就觉得新语言新框架其实不是什么问题,很多还是照猫画虎嘛。
                          • C++ linux下 开发 貌似像Java的那样的 类似于 spring 那样的framework 很少吧? 这里老的代码 都是自己实现的木有啥现成的framework 给你用! ^_^
                          • 个人认为应该给她机会. 起码问问她卡在哪里? 哪里需要帮助? 毕竟原因有 1. team work 2 大家都出来跑江湖 好混饭吃的 不到万不得已不砸人家饭碗! 嘿嘿
                          • 对三姐,不高;对老中,太高。LOL
                            • 对极!! ^_^
              • BTW,兄弟说一下我个人的看法, 你人身攻击就木有意思了吧? 就算我无知起码我思考了吧? 说那些话不感觉很多余吗? ^_^
              • 貌似网上很多程序员都持他这个观点,应该不是完全没有道理。
              • boolean 哥还是很精辟的,封装变点其实真是很多 design patterns 的精髓
                • 我想说的不是什么DESIGN PATTERN, 只是个例子来说明码感觉只是个学习和练习的过程, 不知道讨论DESIGN PATTERN和我说的有什么关系?我只能认为是来显摆的
                • 我对 OO 理解不够! 我比较无知 还是别来误导大家了! ^_^ 我闪! 不敢在这里发言了! ^_^
                  • 你的观点前部分是对的,设计模式这本书是针对当时面向对象语言的不足的一种work around, 例如纯oo语言没有全局变量,所以用singleton代替,C++语言上不支持double dispatch, 才有visitor 模式,不同意你对继承和多态的理解,favor object composition over inheritance.
                    • 我对visitor pattern 一点个人理解!
                      Visitor pattern 为了解决啥问题呢? 就是说你定义一个 class , 但是你知道日后一定会改变需求, 但是具体的变化你 真的是不知道.

                      那么好了 Visitor pattern 就来了. 它就是在你设计的class 里面 开个小小的窗口接口, 以便你日后决定具体的改变.

                      其实Visitor pattern 有点破坏OO的 封装的特性. 具体实现是用 double dispatch 来玩的. 其实说到design pattern 我有时候真的是不知道具体的pattern名字.

                      但是有点不客气的说, 我几乎可以做到手中无刀 胸中有刀的境界了! 自吹一下. ^_^ . 其实pattern 就是实际当中你解决问题办法的抽象. 如果类似于 这个 visitor pattern. 完全可以根本不用, 到时候生bind 函数就是了. 所以有的时候 design pattern 有脱裤子放屁的感脚! 个人之间, BTW 我不敢说 23个 pattern 我都熟悉吧. 但是起码感觉 80% 我都比较了然于胸吧. 可能我比较偏激, 我越写 OO 越感觉 OO 有脱裤子放屁的感觉! 所以我上面说 向伟大的 C 语言致敬! 个人对OO 语言理解不透彻. 希望大家少拍砖! 更不要进行人身攻击. 我承认我很菜! 但是我起码有说出自己想法的权利吧? 咱爹妈给一张嘴, 除了吃饭, 就让说话. 这个别让我的嘴失去50%的功能阿. 上帝估计都不答应! ^_^
                      • 网上有些偏激的发言,何必太往心里去?讨论技术问题而已,没必要掺入个人情感。人各有长,相互学习才是正道。
                        • 理解万岁! 眼泪哇哇的流啊! ^_^
                      • 我也是来讨论的,对于技术同行也不会发表偏激的言论,你对用C来写OO程序,也是业界流行的,我以前写机顶盒程序也是这样的。
                        • 赞一个!!
                        • 还有越写代码, 越感觉我咋啥都不会? ^_^ 天天就知道 copy paste 加上放狗 搜了. ^_^
            • design pattern 相当于围棋定式,你不能说 “所有围棋定式的基础都是叫吃,所以了解叫吃就够了,定式都是忽悠人的”,对吧。定式是棋下多了自然就悟出来的,棋下得好,你下的棋肯定符合一些定式,哪怕你都不知道那个定式的名字...
              很多时候,design pattern 就是让人 communicate 用的 ---- ”你这么走不行,没看出来这是个 '倒脱靴式' 么?“

              另外,设计的关键就是见招拆招 ---- 什么时候 inheritance 什么时候 composition 完全看情况...

              一般来说,学武之人:
              一开始,刀就是刀,剑就是剑
              到后来,刀走剑招,剑走刀招
              再往后,刀还是刀,剑还是剑
              ....
              ....
              拈花摘叶...

              lol...
              • 说得好。。。
              • 本来想另开篇聊聊design pattern的,关键的地方给你两句话就说完了。呵呵。design pattern 对初学者是学习的工具,对中级者是验证思路和设计的工具,对高级者是交流沟通的工具。
                • 严重同意! 但是我个人呢 如果已经存在的代码 有大量的pattern呢, 那我就交流用pattern吧. 如果不用呢, 那就用别的方式交流! 我人比较随和! ^_^
                  • 重要的是“意图”,不是 pattern 本身。参阅独孤九剑。
                    • 做到心中有剑? 嘿嘿
                      • 看破对方意图,见招拆招。预测变化。唯快不破。
                        • 牛!!!
              • +10. 多年前看design pattern书时,就发现原来我自己设计的代码很多都符合design的思路,当然只是一些很基础的pattern。
      • 完料,看贴回帖的功夫,我的沙发没了。
      • 不该苟同。干同一件事,有写人就是容易比别人干得好。不仅适用于技术领域不该苟同
    • 继续坐沙发。据说OK Bridge收费的,没玩过。网上桥牌玩过联众、亚轩。不过现在联众也没什么正经人玩了,多是一些新学的小孩。修养差的很多,基本上张嘴就是“叉”。我们已经太老,不适应这个江湖了。
      • 当时是免费的。打牌的都是大学生,因为那个时候只有学校才能上互联网。
    • 码感强的人确实有优势,但是我发现码感强的人常常陷入代码不能自拔而进入误区,甚至成为项目失败的主要原因。这是中国人码工最常犯的错误,其实一个项目的成功优秀的代码只是其中不到10%原因。
      • 哦哟呀。全看明白了:有码感+三个月练习 =无码感+一年练习 That is it .
        • You got it! ^_^
          • OMG,这太太太鼓舞人心了!!!真不知道说什么好。。。。。
            • 编个打麻将的程序吗。
              • 欢迎回来。不会打。。。。:((
            • IT行业里面活儿分工不少. 要是玩糙 快 猛的编程啥的 就去学学 python PHP 等快速上手啥的! 建议学学 立马能把时间转换成效益的东西! 嘿嘿
              • 谢谢你啊。不敢调皮了,据人说北美见到的最没技术感的就非我莫属了,我没想转行,但很喜欢看你们大拿的debating,崇拜呀。。。
                • 我可不是啥大拿! 我就是个普通的打工仔! 这里大拿多的是 , 但是不包括我! 我就是个跑江湖卖艺的! 嘿嘿
                • 搞C的看不起搞C++的. 搞C++的看不起搞java的. 搞java的看不起搞.net的. 搞.net的看不起搞js的. 搞js的看不起搞html的. 搞html的看不起美工. 最后美工周末去泡mm的时候, 一群傻X在那里加班!(ZT),太典型了,LOL,LS是搞C,难怪那么牛
                  • 同意同时搞汇编的也看不起搞C的搞C#的也看不起搞VB和PHP的
      • 呵呵,这可要看是什么项目。明摆着一票过的MIS,或者三两年就重写的那种,确实!但是如果对性能要求很高的产品平台,这对于设计和编码可是根本啊,说过半都不为过。
        • 任何事情都有例外,但是这里大部分人是写商业应用软件的,写出来的东西大概过得去就行,这就是为什么外包盛行,而写代码这种工作是最容易被外包的,因为这种工作在项目中其实是最简单的,那位大拿喋喋不休的炫耀那点CODING技能真没必要
          • 心态平和点就好,看看他写的东西和自己实际情况有多大出入也好啊。再加上如果单纯做一个外包的码工,被替代的可能性太大了,和坐在办公室里打labour工没太大区别啊。既然做了,还是求进一点
    • 这个要再顶一个! 给准备干 IT 的人, 一些中肯的建议! 非常好! 再次顶你个肺!
    • 当然这首先是一种天赋,有些人在构造程序结构的时候就有独到之处,对于面向对象、解耦异构的理解好像都是理所当然似的。这种人在实践中很容易通过实际的例子去把书本上的知识体系串联,举一反三,以至于”新“技术出来的时候也只是当初的一些演变而已。
      • 感觉大家移民来加拿大的应该都蛮厉害的!(除了我!). 给点入门的建议! 大家都可以干的不错的! 期望干IT的华人越来越多! 这样的正能量的帖子也要顶!
        • 顶。这才是正能量!
    • 兵哥威武,赞一个。
    • 码感?很有意思的一个说法。特别想知道,在码界混了十几年,也不知道自己算不算有码感的人。