读了很多书做了很多习题仍然无法做项目主题分享

(记录Joe的分享,不作为其他用途(侵权删))

       我是Joe,现在是一名软件工程师,做了8年多软件项目的开发,目前就职于阿里巴巴。

       很开心能有机会跟大家做一次探讨,探讨的主题是《从学生到工程师》,希望通过这次分享,能或多或少解答“会做习题但不会做项目”的问题。能力一般水平有限,如果过程中有说得不对的地方希望大家多多包涵。感谢阳叔做了这样一个平台,希望我也能用自己不算丰富的经验帮到一些朋友。

       很开心能有机会跟大家做一次探讨,探讨的主题是《从学生到工程师》,希望通过这次分享,能或多或少解答“会做习题但不会做项目”的问题。能力一般水平有限,如果过程中有说得不对的地方希望大家多多包涵。感谢阳叔做了这样一个平台,希望我也能用自己不算丰富的经验帮到一些朋友。

       所以今天的分享跟前端的关系不大,主要还是想告诉大家,市场上,或者说行业里一线的企业、团体,需要怎样的人
换句话说,如果你希望以后能通过编程来养活自己和家人,你需要知道哪些东西。

       以我自己当年的自学经历来看,在刚开始的阶段,一般来说所有的注意力都会放在“怎么写代码”这件事情上,对未来的工作考虑的也比较少,也不知道以后我工作的时候会是一种怎样的状态,那我觉得我自己当时有一个比较好的习惯大家可以参考一下。我一般隔三差五会去一些招聘网站上看看,看那些我比较想去的公司的一些招聘要求,有哪些我能达到的,有哪些我达不到的,那看多了以后其实会发现,一般这些招聘,对于职位的描述基本上都是xxx工程师,很少会写xxx程序员的。

       为啥大多数都写要xxx工程师,不是写xxx程序员?其实各位可以思考一下这两者之间的区别听着更高级?编程这件事是在国外先发展起来的,对,一开始我也这么认为,我觉得工程师就是程序员一种比较装逼的叫法。但其实在国外,软件工程师,和一些机械工程师、建筑师等等相关职业,定义是很类似的。以我的经验来总结,工程师,是利用工程方法,解决实际问题的人。而xxx程序员,举例来说,java程序员,是指会使用java进行编程的人。这两者之间有个问题我希望大家能明确,编程语言对于软件工程师来说,意味着什么,它实际上只是一种工具,和锯子、斧子对于木匠来说的地位,区别并不大。

       举个例子来说,我现在开了一家公司,我招聘你进来对于我来说,我希望你为我做什么事情?我是希望你来跟我show一段java代码来表明你很牛逼吗?当然不可能。为你赚钱?那么怎么才能为我赚钱,就是帮我来解决问题。以阿里巴巴早期为例,马云他是老板,他有个想法,他想要做个电商平台他去调研,分析了市场是如何如何,行业如何如何,好了,他现在很确定干这个很有前途,这时候他开始找人了,你猜他希望找到哪样的人? 理所当然的,他希望找那些能按着他想法,立马帮他把他要的这个平台弄出来的人,这个时候,比如像linus这种大牛(搞出Linux操作系统的人),牛逼不牛逼?但是一定不是马云需要的 。因此得到这样一个推论。初创的小公司很少会招一些拿着巨额工资做一些虚无缥缈研究的人,就是这个道理,不是那些人不牛逼,只是这个阶段不需要。现在阿里巴巴作为最大的电商平台,他所面对的是继续领跑,并且也有资本有实力做一些前沿工作,这时候问题变了,要的人也变成了越牛逼越好了

       我继续:推论  老板要人帮他解决问题,工程师能够帮他解决问题,所以他要工程师。可以去看一些知乎上的回答,关于小公司从业经历的,你会发现,在小公司很多时候你什么活都要干,不要以为你入职的时候写了个前端工程师你就只是做做前端就OK了。你做的事情只和公司所面临的问题有关,就是那么简单,那么公司这么大的一个东西,它所面对的不可能只是一个问题
问题各种各样,只是有优先级高低,解决问题的价值那也就有了高低,像前面那哥们儿所说,融资的问题。例如像有赞这样的公司,在这个阶段会有个一直存在的问题就是   活下去。这是根本问题,这个问题不解决,其他都是扯淡。怎么活下去?融资是一种解决方法,拓展业务提高用户基础也是一种方法。所以你会发现,那些有很多渠道搞到融资的人,他每天就算什么都不干,也比你累死累活加班加到死拿的工资高。为什么?就是因为他所解决的问题,价值更高。回到软件开发,还是对于有赞。比如说你现在对有赞的产品做一轮分析,以前端为例,比如说你觉得有赞的前端做得很垃圾,交互也很差。这时候你说你有能力改变这一切,让有赞的前端变好,能更加吸引用户,那你就是他真正想要的人。换个例子,比如阿里,阿里希望自己能在技术上有影响力,希望定义行业的标准,那如果这时候你是很多开源框架的核心代码贡献者,在社区有很大的影响力,技术研究得很深,那你就是他真正想要的人(至少对于这个部门)。

       我们一般讲,在一个相对公平的环境里,你得到的收入,一般和你的价值有关。

       所谓价值,我有个很简单的公式 :价值  =   单位价值 *  影响面积。

      单位价值可以从很多方面来分析,但其中一条就是,你解决的问题,距离金主(给你发钱的人)的根本问题越近,那价值就越高,这个行业已经发展到了一个人用毕生辛苦也只能懂一小块的地步了。因此你所说的情况,在小公司有可能出现,在一个领域也有可能出现,但在一个大公司是绝对不可能的。关于“距离根本问题远近”我稍微解释一下。老百姓的根本问题有很多,最基本的是安全,然后是温饱,然后其次。从这个角度来看,对于国家来说军队的确是最重要的,他保障你的安全;然后是粮食。就像以前古代中国最终要的两件事:耕、战。对于公司老板来说,他最重要的事情是赚钱。根本问题可以一层一层分解,你所解决的问题离这个根本问题越近,你越有价值。极端一点,你如果能直接给老板赚个一亿两亿给他,你在他心里就是爷了

       问: 所以我能单纯理解,即使做前端不能只靠技术,还要考虑市场用户方面嘛?

       答:不是这样,首先要考虑的都是自己的直接上层的问题。你作为开发,你的直接上层是给你提需求的人,比如产品经理,比如市场部的一些人,比如一些测试等等,不能一概而论。

       那下面的时间是我大概总结的一些关于怎样成为工程师的小建议。

       问:那怎么去了解上层的思想?

       答:最好的方式莫过于,你也站在他的角度看问题比如你的上层直接是老板了,那你最好了解一下他可能在痛苦些啥。比如市场打不开局面,做出去的产品用户不喜欢等等。
       首先我给大家的建议是“少提问题多搜索”,一般我一说这个点,听的人都会觉得,这个人好装逼,问题都不让问,这个我在这里解释一下,不是不让问问题哈。特指是你写代码的时候遇到你无法解决的具体问题时,最好能尝试自己通过手段解决。一方面,这种方法比较快,你在群里提个问题,我的xxx怎么配置啊?群里不知道啥时候有人会来回你,然后你就在那等? 把你的问题放到百度或者谷歌里,几分钟浏览一下,搞定了,你觉得哪种效率会更高一些?另外一点,我可以很负责的告诉各位,除非你想一辈子拿着很微薄的底层工资,当你成长起来拿到你想要的高薪的时候,基本上丢给你的问题,整个公司,甚至整个行业你就是那个最懂的人。你需要掌握的,更重要的是遇到问题的解法,比如你高考,考前先看书上课,这是打基础。然后刷题,做模拟卷,不是让你背答案,你能把高考答案背下来?无非是锻炼解题方法和能力,到时候换个题目换个套路你照样会,这样才能考得好。刚刚这是第一个建议,那么第二个建议,就是学会怎样去提问?我在知乎经常收到各种私信提问,有些问题问得非常好,有些问题就显得很无聊。首先对于回答问题的人来说,回答那种百度一搜就有结果的问题很浪费时间,也提不起兴趣。然后,问题层次反映了你在这个问题上的思考过程和思考结论,我以刚才群里的一些问题为例,写代码的时候遇到一些问题自己要很多代码,然而看到网上大神写的特别简洁,该如何提升? 这个问题可以算是一个好问题。这个问题应该是你实际写过代码,并且被网上大神吊打过以后,应该还不止一次,才得到的问题。这个问题没有标准答案,是一个需要讨论的topic,你可以问任何人,任何人都可能给你不一样的答案,然后你拿去分析拿去总结,在你现在这个阶段对你帮助是最大的,是最能帮你提升的。如果你不是很赶时间的话,比如老板在催你这种,你最好自己硬啃,这对你的帮助是最大的。写代码的时候遇到一些问题自己要很多代码,然而看到网上大神写的特别简洁,该如何提升 。后面的内容其实就是这个问题的泛化。如何提升自己的工程能力,解决问题能力,还有编程能力。解决问题包含通过工具进行搜索。搜索这件事其实没那么容易。你把你的问题直接写下来搜索,一般搜不到答案的,除非你的问题过于简单, 这个时候你要迂回了, 曲线救国。你需要做的一件事就是分解问题,把一个大问题分解成一个个相对简单的小问题拿小问题去搜索,如果还是搜不到,对于小问题继续分解,直到你自己能解,或者你能直接搜索答案,这也是锻炼你工程师最重要的能力,分解问题。分解问题就是你的思路。不排除一些脑回路特别清奇的选手,怎么弄都不行,那这就需要锻炼和继续学习了。

       问:我写程序都是先把问题考虑好,分步骤 

       回:你说的对,一般来说真正写代码的时候是很简单的,难得是写之前的“考虑好”。

       我给大家推荐的一种提高自己最快速的方法,就是做系统分析。首先,这种方式是适用于那些合格的自学者,如果你无法坚持看书或者写代码或者做相关的事情,那可能你不适合干这行,世界上也不只有写代码会有前途。代码不用记忆的,“考虑好”的方案要记忆注释主要是给别人看以及给未来的自己看的涉及到协作开发,编码习惯相关的内容,今天就不涉及了。我继续说系统分析,系统分析说起来简单的,就是找一个你觉得很牛逼的代码、项目,看他的代码。但是看代码,不是瞎看,我希望你每看一个系统之前,能先回答这几个问题(我在知乎上其他答案里有说)
      1. 你再看的系统是什么系统
      2. 这个系统解决了哪些问题
      3. 别人为什么要用这个系统
      4. 它有哪些组成部分
      5. 不同组成部分之间的关系是怎样的

      你们现在可以脑海里找一个自己觉得很牛逼的系统(最好开源),试图回答一下上面这5个问题。
插一句,我其实比较反感那种瞎吹xxx框架xxx技术的人,所谓瞎吹就是连这几个问题都无法回答,然后就说它怎么好怎么好独立的思维很重要,得自己带脑子,别人说什么是什么,最危险。
如果你回答不了这5个问题,你可以:

     1. 找一些书来看,例如java里的spring框架,讲解spring的书要多少有多少,你先搞来看看再说,不过最好还是直接看官方文档,书籍都有滞后性

     2. 把那个框架或者系统实际用一用,深度地去用 。如果对于一个系统你已经能轻松回答上面5个问题了,我建议你可以开始阅读源码了 。阅读源码,要达到一个状态就是:当别人随便拿出一块代码问你的时候,你能够回答下面的问题
     1. 这块代码是用来干嘛的,对应了哪个功能
     2. 为了实现这个功能,有更好的方法吗?
     3. 这块代码为什么会出现再这个部分,合理吗? 

     前面5个问题+后面这3个问题,我称为是对系统的一轮深度分析,伴随着你的职业生涯,你不断重复这个过程,不断积累,是你成长最为快速的一种方法。

    像刚刚有个哥们儿问的,觉得自己写的代码总是没有网上一些大神写得好,其实这个你不用着急。写代码的是分阶段,最初的阶段是学基础,要懂某个编程语言的语法,基本的代码结构,给你你要能看得懂。然后是学代码设计,比如著名的设计模式、函数式编程思想等等。再往上是系统设计,就是需要积累相关经验和阅历,具体方式就是我刚刚说的系统分析,我猜你可能刚完成第一阶段,对于第二阶段了解得还是不够多。我这里给大家介绍一种工具,就是画图。画图要带着目的性去画,才能帮到你,否则就是装饰品。首先,各位可以去了解一下思维导图,这个对于做问题分解非常有帮助,无论是生活问题还是工作问题,我家里装修也用这个来理思路。第二个,是流程图,这个大家应该很熟悉了。通过思维导图把大问题分为小问题后,对于一个问题的具体解决方法,你可以画个流程图来对应上。一般来说流程图你能画得出来,那代码你也能写得出来了。第三个是系统架构图,系统架构图有各种类型,有兴趣的可以去了解一下,最重要的目的是为了像别人介绍你的设计,你的产品
       最后,我列一下我认为自学可能会有的几个误区 

        1. 对于书的态度。书是你学习的方式和工具,但不是学习本身。不要认为看书就是在学习了。看书的过程中总结出自己的理解,记下来,这才是学。看完后做习题或者进行实际操作,这个叫练
加在一起叫学习,缺一不可

        2. 自我感动。自我感动最危险,举例来说自己原来一天玩12个钟头游戏,今天只玩8个钟头,4个钟头用来看书了,那觉得自己好棒棒,简直辛苦得一笔,把自己想象成一个为了梦想不断奋斗的好青年。请清醒一点啊各位,努力的过程没有意义啊,拿到结果才有意义啊,在拿到结果之前,你为了这件事所付出的所有东西没有任何价值啊,拿到结果是对你努力的证明,不拿到结果就没有证明,没有感动的理由
       3. 光看不练,这个我不多说了。

      4. 格局太小。我看到过有人照着博客做了个东西,然后不可一世,觉得自己很牛逼……学东西做东西,不是跟谁比,更重要的是让自己有更多的收益,过自己想要的生活,抬头做人,低头做事,做好,做大,做到领域前列,这是真正应该追求的
      5. 做作品而不是产品。希望各位能严格对待自己写的每一行代码吧。
      好了,我今天分享的内容就到这里了。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值