原文链接: http://bbs.weiphone.com/read-htm-tid-768284.html
备注: 看了之后很有感触, 不过把名字修改了一下, 原名称是<在美做开发多年,写给国内iPhone开发新手>
从这个论坛开始办这个板块就几乎没正面回复过什么,但平心而论,看的最多的板块也是这个。但从没有发表过自己的看法,因为任何一个人在今时今日都可以成为一个程序员。而在看了很多国内的程序大小论坛后,养成了一个习惯,不敢在论坛里做正面的回复,甚至不回复,乃至连文章也不写。为什么今天破例了?因为被很多新人的那种态度所打动,因为他们真的很诚恳的在学。
罗哩叭嗦的前言到此为止。我说一下我个人经历在先,我做过PPC的项目经理(可能现在改名叫WM),也在塞班智能系统刚开发之初做过一些商业项目等等等等都和嵌入式有关。但我一直认为那个时候的我的开发都是不成熟的开发。为什么?因为和很多新手一样,陷入一些误区。就是到底什么是开发程序?这个错误大家常犯,为什么开发程序,是一大堆数据处理,从第一个程序诞生到今天,程序就是一大堆的数据处理。而其实很少的国内开发人员考虑过这一点,因为他们大多考虑的是自己的饭碗和升职。所以他们忽略了最基本的东西。而多数国内论坛也把这些东西认为是无需讨论的。而那个时候的我也是。
为什么我在文章的一开始就提到了一大堆数据处理,那是因为数学。可能看到这里大多数学生朋友都会笑了,数学我很强。如果这样想,这样你和我以前的我一样又进入了一个误区。这里我还是以我自己说一个例子,我在美国上calculus,在上之前,我本来不想上的,因为高数什么的我都很轻松拿到了高分了,这calculus算什么,对于中国人来说,简直就是智商的侮辱,而且第一次Quiz和Midterm也证明了我的想法,多数的外国人的均分就60多,而中国人几乎都是85以上。而在这成绩背后我却发现了一个问题,就是题目我们都会解,但老师为什么一定要反复的证明趋向于一个数字,他写了满满一个黑板的2.0,1.999,1.998,1997 趋向于0,然后他又写了从-.2.0,-1.999趋向于0。其实那时的我认为老师很傻,有必要吗?你做这些不会改变定律,也不会改变任何结论。而且定律大家都已经知道了。后来我在上完后,找到了老师,问她为什么你要这样写?她开始笑了,然后对我说,其实过程比结果更重要,而她个人也认为在这些过程中,说不定哪天她会看到一个,那个就是一个很tiny的一个数字,他的趋向可能会不同。其实她说完这些我还是没理解,而且我还是认为她很stupid更多的是古板。但当我完成所有的理科科目后,我终于有了很微妙的转变,那就是哪怕是一个简单的结论都需要去自己证明出来,因为说不定哪一天我也可以去推翻这个定律,因为我发现了一个很tiny的错误。 我想了半天,我决定用这个例子,因为这代表了美国和中国文化的差异,没有那一方是对的,或者错的。只是个人如何去看待这个问题。
而这也是为什么要学习离散数学和线性代数和高等数学甚至物理,如果你实实在在的从根本上了解了他们,你的开发程序技能已经是有一定水准了,哪怕你就是不会C。而这个例子的证明,在国内很多,比如很多清华的数学系和物理系的学生,在phd或者master转入了CS(计算机技术)专业,他们会有很大的发展空间,而往往都是这类人比从一开始读CS的人取的成就要高。
可能看完上面你已经灰心了,因为你的数学不好。数学是一个捷径,如果我们没有这个捷径,我们还有创意。这说起来好简单。看看国内软件行业就明白,没一个有创意的软件,在说远一点,你用百度去搜索一个技术参考,可能有1000到2000个结果,但可以很负责的说这1000到2000个结果都是重复的。如果你把这个keyword打入Google美国服务器,我也可以很明显的告诉你,他的重复率低的让你难以想象。为什么搜索结果和创意联系起来。因为抄袭首先扼杀了创意,而什么是创意,那个不是高深的理念,更不是什么多符合数学或者物理逻辑的东西,那个是一个纯粹的想法。
而多数的程序员在有了好的想法之后,就开始束缚起来,要加密,要如何创业快速赚钱。呵呵,很符合中国特色。其实一旦当你在最初阶段就把你的创意捆绑上这些附加的东西之后,他就开始陨落了,除非你有很强大的公司做支持,比如Google或者MS,或者Apple。所以,有了好的想法后,不惜代价,勇往直前才是一个程序员的信念,哪怕市场就是不好,先把它完成,在一段时间后,说不定就会被注意,in other words. 哪怕就是不成功,没人注意,对程序员本身而言,这也是一种经验的累计,因为只要你去写代码,你就会发现你需要的知识很多。 那怕就是一个小的semicolon(;) 摆的位置发生变化,在程序上,也有可能发生质的变化。therefore, Just do it if you got good idea.
说了2个大前提,让我们开始进入一些开发细节。我看了多数人喜欢问这个一个问题,我要具备哪些语言才能开发apple的程序或者java的程序。
in fact, my answer is nothing. 做java开发也好,做objectC开发,乃至php什么都好,C不是必须的基础. in other words, 你会C和不会都一样。而为什么有很多人强调无论学什么你都要会C,这个论调在国内很多,他们说没错,因为可能他们老师是这么说的,或者他的学长或者学姐也是这么说的。但其实,国内多数人都没给出一个为什么要学C的理由,其实看多英文书后,你就知道了,C是一种Thinking, 我并没有去翻译这字,因为Thinking代表很多,不单单是解释他是一个想法。thinking包括你的文化,包括你的个人经历,甚至你对其他专业的理解。而我个人的理解对C就是,他是一个做大型程序的基石,而对于你只是完成一个普通程序,可要可不要。因为现在的计算机英文开发教材都是属于解释性的,什么叫解释性,就是作者把那些枯燥的东西用他们自己的经验和实力通过最简单的语言给你解释了一下。所以你不需要任何其他基础, 只需要和twitter一样,去follow以一个你喜欢的作家,但找到这个你喜欢的作家要花很多时间。
而开发语言,真的无太多话可以说,你只要去记住那些就可以了,OOP就那么点东西,说来说去就是继承,多态,封装这些。最难的也就是C++,因为他只是一个不全面的OOP,或者不完善的OOP,所以他难,因为没完全遵循OOP的规则或者原理。 而相对java就容易很多,因为就是一个纯OOP。而了解OOP的人,或者你真的掌握了她的精髓后,你会发现她是一个合理的东西,而不存在难与不难,就等于Thiniking in Java里作者反复说的一些句子,万物皆对象。而这个对象就是我们在现实生活中天天遇到的,再打个比方,你对你的另一半有些基础的要求,比如是男性是必须,然后要20岁以上,太小不行,则就是你的field. 而有了field就是需要一些function, 比如这个男的需要有钱,所以他能赚钱这个function是必须的,当然能实行人道这个function也是必须的。就这么简单,OOP基础就这些,在深入一些,也有很多,花个2到3天时间就掌握了,所以不要一开始就问难不难。请记住,在中国这么艰难的环境里,你都能生存下来,还有什么可以算得上是难的。
而如果你有C的基础,其实还是要看一下ObjectC, 因为很多定义还是有一定差别,就等于你会C++,可能也用了C++多年,但你刚接触java的时候,你也要难免有点不适应,比如继承里,你不能继承多个base class, 而且要使用interface, 而更具体的,逻辑方面的东西更现实化,比如instanceof(), 例子有很多,但说白了就是更方便你快速开发。既然这里说到了快速开发,我在这里就展开这个话题,作为一个新手,不要考虑太多,用现有的你的资源去把你的想法去实现,那怕就是VB也好,不要太在意我今天学的这个java是不是过时了,或者ObjectC是不是太不可移植了。请在你脑海中一定要放弃这个概念,任何东西都会过时,但Thinking是不会变化太大的。而我们要master或者要handle的是Thinking.
多讨论,这个是我在美国学到的另一个东西。其实任何人都可以讨论,我的另一半是学生物的,对计算机编程是完全不懂,但我很喜欢问他,你认为这个如何?他经常的回答很让我生气,比如他自己的项目有时候,其他人是用java写的,他的浏览器没装可以打开java程序的东西,他就会很愤怒,为什么你们这些做程序的不把问题简单化。我当时也很气愤,人家用java写有什么不对,但我静下心来想想,他就是一个最终端的用户,虽然他的要求不符合计算机原理,但最起码他对这个程序是感到厌烦了,而那个用Java写的人,完全可以用ajax加php做改进,这样就把这个问题让非程序员更容易理解。最起码容易打开。所以和任何人去讨论,去聊天,你会得到很多东西。而那些东西是你一辈子在书上学不到的,但肯定会让你的程序更贴近用户。如果你和可以和你奶奶(前提你奶奶会电脑)多聊一会,他们也会给你他们需要什么样的程序,而不一定要到处找灵感,因为灵感就在你身边。
最后一点就是讨论后的认同,国人很不喜欢认同别人,总是会认为自己比别人有本事。但在来美后,我也开始逐步的去承认别人,这在以后的team work中很重要,国内的team work不多,所以很难体会到,一个组员,一个手下,他们都会有他们的想法,而一个好的leader甚至manager, 是需要过人的包容力,而这个包容力的基础就是去认同别人,因为他们会在任何的一个时间点上说出一些你不知道,或者你没想的提示,而这个提示可能就是你的软件项目的转折点。
本篇完结,我的结语就是:虽然社会很让你无奈,但作为一个“人”,做任何事情,都要先尊重和了解身边的一切,这样你才能成为一个人,最少也是一个对别人有帮助的人,而程序员就是用程序去帮助人,而不是停留在自我满足的层面。