那些年薪百万的程序员 “咸鱼翻身” 没有透露的秘密
首先,世界上没有最好的程序语言,只有最适合个人程序语言。程序语言本来就只是工具、只是手段,从来都不是重点,
重点是:你的目的是什么?你要解决的问题是什么?
假设你今天想要写一个网页留言板(这边只讨论后端,不包含前端),那你就不应该用C来写,因为比起C,php会更适合,很多phper要说了“php是世界上最好的语言”
你可能会问:那nodejs,rails,asp.net…就不适合吗?
如果你只是单纯想写个网页留言板,其实上面这些都很适合,挑一个你最喜欢的语言就好
但如果你要解决的问题不一样,就应该重新思考。例如说,我想要很短的时间的写个网页留言板,你就应该用rails,因为rails开发真的超级快,随便打几个command,你的网页就神奇的出现了!
“我想要很潮的网页留言板!”那你可以考虑Go,Swift,Nodejs等等
再举个例子,加入你今天想要研究电脑较底层的运作,那么你应该要学C,或是学汇编语言因为比起其他高阶语言,这两种绝对会让你更了解底层到底在做什么,其实以上这些只是想提醒你:不要为了学语言而学语言。
程序语言只是一个好的解决方案,重点在于最终的目的!重点在于你想要通过程序,达成什么样的目标,当然如果你真的只是纯粹喜欢写程序,就当我没说。
为什么要当程序员?
我的理由很简单:为中华之崛起而写代码!我觉得做程序开发让我很有成就感,只要几天就可以写出一个网页程序员,可以随时帮自己写博客系统、帮朋友开发投票网站系统之类或者去程序员客栈www.proginn.com接私活赚些外快等等。尽管早期写出来的东西可能不怎么样,但那种从无到有真的是一件非常有成就感的事情。
我永远忘不了我用VB拉几个按钮出来,点下去就可以跑出文字的那瞬间,我有多感动,那是我第一次写代码,虽然当时还比较菜,但是“兴趣的培养”是每个程序员一生必备的职业兴奋剂,下面给单纯有兴趣或者想转行程序员的同学一些建议,希望能够帮到大家。
1.学英文
这个其实上学的时候大家都有在学,只不过个人差异,每个人的水平也都参差不齐。
Q:我该学什么程序语言
A:英文
为什么?因为英文真的很重要!听说读写,至少读要读的懂,你才看的懂那些外国的API文件,发生问题的时候,才能去stackoverflow上面发问,说到这里就必须要和大家说一些基本的提问技巧,很多问题为什么很少人愿意回答?例如:我写了一个网络通信的程序,想要让A手机跟B手机可以传信息,可是按了却没反应,怎么办?我的代码不够优雅怎么办?
一个好的问题,应该言简意赅,直击重点,个人觉得应该要包含四点:
1.目的(你的程序要达成什么目的?)
2.手段(你怎么达成你的目的?)
3.错误(在什么场景下发生的什么错误?)
4.代码(有排版过的代码,拜托)
所以将问题改成:
我想要让A手机跟B手机传递信息,我用的是java的socket,可是按下发送时,出现:java.net.SocketException: Connection refused: connect,想请问一下有可能是错在哪里?
部分代码:https://gist.github.com/xxxxxx
上面的问题还可以再修正、补充更多细节,但至少比刚开始那个好回答的多,会让人比较想回答,代码一定要找适合的地方保存。再回到英文的这个话题上来,英文不好的话,其实国内的资源也很多,但很多新的技术或者人气旺的地方还是用英文,所以英文好的话不会吃亏,可以运用到更多的资源。
2,google很重要
相信我,google真的要比其他搜索都好用,我经常认为会google就先赢了一半,现在网上资源那么多,有时候出现你不懂的ERROR,完全没有头绪怎么办?最简单粗暴的方法就是直接google,一堆解决方法就出现了,这个时候不是简单的复制粘贴,而要去试着理解为什么这么做,一个不会理解代码的人,只会是一个复制粘贴的机器人,这样对自己的成长没有好处,至少要弄清楚两点:为什么会有这样的问题、这个解法是如何解决的?关键词的使用非常的重要,比如一些常用的指令一定要学会,例如:inurl:、intitle、filetype等等。
3.学scratch
我听过这个很多次,但实际接触才知道真的很好用,这个就是让你用很简单、很可视化的方式来写程序,你只要拖拉几个拼图、组合在一起,就可以写出一只可以动的程序,甚至是一个小游戏!
如何开始学scratch?
如果是我的话,就会google搜寻:scratch教学,或是scratch入门
为什么要学scratch呢?
前面有说到,每种程序语言都有不同的适合的场景,还有一点是,每种程序语言,都有很大部分是相同的,例如说:变数、函式、循环、条件判断、数组…
当你学C有这些、Javascript有这些、Swift有这些,不管学哪种程序,都会碰到这些最基本的东西,无论是再复杂的程序,都是这些基本的东西组装而成。
从scratch来学这些基础有两个好处
1.不被语法限制
2.可视化
scratch里面你几乎不用打字,甚至可以看做是拼图游戏,你就把你想要的东西拼一拼,程序就写完了,所以你学的是真正的概念,而不是语法。
举例来说,如果你学C,你就要学:
如果你学python,就会是:
其实我不会python,如果写错的话,各位Python大神原谅,但这两者本质上是一样的东西,都是循环,只是语法不同而已!
从scratch开始,可以让你跳脱这些语法,只学那些精髓,你学完之后,看到C的这段就会知道:哦,原来这就是循环呀
第二点,可视化也是很重要的一项,尽管我代码写了很多年,我永远忘不掉,我在循环这个坑卡了多久,尤其时双重循环,根本就是恶梦!
我知道这边是1到10的意思,但是第二层为什么会这样?
为什么这样就可以印出九九表?
那时候我面对的是冷冰冰的代码,大概就是:
尽管我可以很轻松从排版跟大括号一眼看出「block」的概念,但十年前的我完全不行,至少觉得这就是天书,可是scratch就不一样了!它直接用可视化的拼图的概念,让你在循环里面可以塞另外一块拼图,就可以明白为什么双重循环会是这样了!
4.有些指令一定要会(command line操作)
这是什么?对,你没有看错,这就是电影里面看起来很帅的,底是全黑的画面,屏幕上面满满的文字,一张图都没有,在windows就是cmd,命令提示字元。
在mac就是terminal,终端机,假如你已经对上面介绍的scratch满熟悉了,那你应该了解程序几个基本概念,其中一个重要的概念是:写程序其实就是在对电脑下指令,其实呢,你平常在做的事情,也是在对电脑下指令,但操作系统帮你包装好了,所以你只要动动手指就可以,例如说你在网页上按了重新整理。
「我要重新整理」换成程序大概就是:page.refresh();或是:「点了前往google.com的连接」window.open('google.com');(这边代码都随便写的,但意思有到就好),我们所谓的command line,就如同字面上这样是个「用文字对电脑下指令」的地方,像是ls,就是list的意思,会把你「现在在的地方」的档案都显示出来。
「现在在的地方是哪里?」打pwd,Print Working Directory就会显示出你现在在「电脑的哪个文件夹底下」
帮大家准备好几个连接了:
(关键字:终端机教学)
OS X Lion 10.7系统基础教学系列-终端机基础操作教学
介绍命令行(command-line)界面
Mac OS X Terminal 101:终端使用初级教程
Mac OS X Terminal终端机常用语法教学
为什么要学这个呢?因为工作上很大机会用的到,而且日常生活也很好用,有些功能你用java写的要死要活,最后才发现原来电脑就有内置指令,我也是最近一年才开始熟悉这些指令的操作,才发现原来内置指令这么好用,给程序开发初学者一些建议,你需要知道这些,并且了解:cd,ls,pwd,touch,mkdir,rm,cat,grep这些指令,还有> >> < |这些符号在干嘛,这样就很足够了,想更精进的可以去学怎么写shell script。
5.学怎么用browser dev tool
chrome,firefox,safari,edge都有一样的东西,叫做开发者工具,为什么要学会这个呢?因为你可以了解很多东西!日常生活中,你其实一直在接触网络的概念,只是你没发觉而已你平常看到的网页,其实也只是一堆文字而已,那为什么文字会变成画面?因为浏览器帮你解析,按照一定的规则画出来,你可以右键->检查,就可以看到你鼠标指的地方本来的文字是什么
dev tool可以讲到一堆跟web有关的概念get/post,ajax,status,css,js,html等等,现成的好工具,不用吗?
6.选你想走的领域精进
假设你上面都有确实做到,你现在应该对程序、对网络都不会太陌生了,这时候再来学专门的东西,我认为是事半功倍。
为什么?因为原本那些程序基础你都可以跳过,你要学的只是语法,学程序最重要的应该是「心法、内功」,而不是表面的限制,这样就算换了一个你从没看过的程序语言,你也会猜的到它在干嘛。如果你看了这篇文章也想成为一名程序员,这里要提醒大家的是心态一定要正确,所谓咸鱼翻身,学会程序开发年薪几百万之类的新闻,千万不要相信,很多这种个例是因为之前已经有某项技能专场,再把专场和程序开发结合起来最终沉淀出来的结果,而大部分没有任何能力基础和背景的人比起这些特殊案例,这些新闻你可以选择忽略,做人最重要的还是脚踏实地。
7.开通个人博客写经验
可以开个blog写写自己的学习历程、碰到的困难以及解法等等为什么要写这个?
第一是加深印象,你解决一个问题下次再碰到时,你还记得怎么解吗?很多时候踩过的坑会反复踩,代码有时候过两三个月会忘掉,但这时候就因为我有写blog记录起来,可以查的到以前自己怎么解的。
第二是增加功力,我要怎么知道我真的了解一个东西?
我觉得写下来,会清楚的认识到自己的能力水平,例如说我今天要写:git入门教学,写一写发现自己不知道rebase在干嘛,我就必须去查,查完之后写在文章里面,你写的出来,你就一定懂这项技术而且博客是公开的,若有路人看到你写错,说不定还会来纠正你,你就又学到一课了!
第三是累积个人声望,好的程序员个人博客对于求职绝对有加分效果,假设你今天是面试官
A的履历写:精通Javascript
B的履历写:精通Javascript,可参照我写过的:深入Javascript原理系列文章
结果你跑去B的博客看,真的写了一系列深入的文章在研究,不用面试,你就知道B是个有真材实料的人(前提是面试官会去看你blog里面的文章)
8.学数据结构跟算法
就是俗称的Data Structures and Algorithm,DSA,假如你真的对这行很有兴趣,想要一直待在这边而且薪水越来越高的话,你就势必要开始补足一些额外的技能「自学的人通常不会有的本科系知识」,因为自学者通常都直接从html,css,javascript,php,rails等等的开始,甚至连数据结构跟算法都没听过!有接触而且实作过的更是少数。
那为什么要学这两样东西呢?
第一,增加自信
其实能力强,自信就会强,增加自信是因为,自学者通常也是非本科系的学生,可能会觉得自己跟本科系的实例有一段落差,这时候若是学了本科系在学的DSA,就可以弥补这一段落差。以我个人来举例,因为我很早就接触到DSA,到现在出社会找工作,就是因为我有这段经历,所以我有自信我绝对不会差本科系太多,甚至会比一些很混的毕业生强,事实上也是如此,去面试的时候有间公司考我排序的问题,就是一些很基本的,说你知道哪些排序法,跟时间复杂度之类的。
“自信在某些时候很重要,能够为你带来打不倒的勇气”
面试没通过,没自信的人会觉得:一定是我太烂
有自信的人会觉得:是公司没眼光(前提是你的自信不是来自于自我感觉良好)
第二,增进对电脑底层的理解度
刚开始你可能只是个拿5k的薪水,但工作久了,可能变成10k,20k,甚至50k,当你薪水变得越高,要解决的问题也相对的更重要,DSA是大公司的必备技能之一,为什么那些大公司面试要考这些?如果不会二叉树反转,就算是知名工程师也没用?
(之前Google的面试争议:虽然我们公司90%的工程师都用你开发的工具,但我们还是不聘用你)
就如同我开头所说的,重点在目的、在于要解决的问题
你在一家普通的台湾电商网站工作,需要会什么?
你可能要会写php,因为要改进购物车,要改进物品上架系统,所以你根本不必懂DSA,因为没什么太大的帮助。
Google要解决的问题是什么?
可能是「排序10亿个数字」、「阿发狗的下棋算法」等等,从要解决的问题看来,你就知道为什么Google面试时要考那些了。
如果你要在技术上日渐精进,你迟早要碰到那些较底层的东西,这跟问题规模有很大的关系,假设你公司今天是做旅游订票,同时100个人抢,一般工程师都可以自己应付,如果同时10000个人抢,这就不一样了,在服务器上你可以能要多开几台机器,要调整一些构架,而程序当然也要跟着调整。
或是你会发现许多大公司,常常都会自己有一些项目,为什么?因为市面上没有符合他们需求的东西,所以要自己写一个。
如果你没修过DSA,你怎么可能实作出virtual DOM diff的算法?
当然我也比较菜,没去面试过诸多大公司,如果有程序前辈看到这里麻烦留言:“你的推测错了!”
最后,引用一段很有哲理的话:如果以盖大楼来形容这个概念,把砌砖作为一种技能,把盖大楼作为一种知识,我想可以这么讲:如果你早就知道你喜欢砌砖,很会砌砖,就直接去砌砖吧。如果你的梦想是盖大楼,你要学的东西还很多,那读大学是你最好的途径。不是每个人都要盖大楼,靠砌砖就可以赚钱了,砌的好还可以赚很多钱,大家抢着要。如果你很会写购物车,那其实你也可以接到很多电商客户,钱包也是赚满满,但如果你是想进Google,Facebook那种大公司,或是想要思考规模更大的问题该如何解决,那就学DSA吧!
9.乐于分享
这一点我一直非常认同,分享从来不是单向的,当你分享知识给别人的时候,也会得到许多回馈,尤其在教别人的时候,你会更清楚自己哪里不太懂,个人认为分享是一件非常重要的事情,取之于社会,用之于社会,如果大家都乐意分享,这样此时一个正向循环,希望大家共勉。