2001年左右的时候,我大量做Windows客户端开发工作,巅峰时可以不看文档把 CreateWindow,CreateFont 这样复杂的函数参数都写出来,你们可以查下MSDN,看看这些函数参数是啥样的。
其实也没什么了不起,就是写得太多了,唯手熟而。
对编程这事来说,不熟练是写得太少,缺乏练习。
太熟练说明知识固化,技术深度广度不够,也不见得是好事。
记不住,你知道我现在得用多少种语言?都记下来不干别的了。
你看到我们啪啦啪啦的敲代码,要是没有ide的提醒,我们可能真的只是在敲键盘或者在和MM聊天。
在软件里有个类型叫做:效率。
对,效率。这些是工作而已,当然用最高效的方式。
最后提醒一下:
编程这个事啊,最难的地方不是下手去写的时候。
当我下手去写的时候,说明我的构思、设想、理论、模型、异常解决方案……都已经在脑子里或者在其他的工具里存在了。
如果不做前期的这些准备,编程人员键盘上敲的最响的应该是“backspace”。
我工作了这么久,十多年老程序了,接触的语言不下十种,做架构、原型设计、现场开发,涉及项目大大小小不下30个,从最初的二指禅到现在的非对称六指禅,打字速度上也没啥提升,那也没耽误我产出。
所以说,一旦涉及到敲代码了,就没什么难的地方了,这个过程越快越好,恨不得让机器自己去生成。你以为模板语言为什么在大型项目里一直是香饽饽……
微软的vs和jetbrain都开始引入智能预测输入,是在侮辱程序员吗?当然不是,得谢谢他们把你打字员的属性压低了一些。
哎呀,跑题了。
我也不是大佬啊,答个什么玩意儿了,摸鱼去了。
你坐在一个程序员对面听哈。
如果这哥们键盘敲的啪啪响,还时不时面露微笑。
别急着崇拜。
很多时候可能只是正在跟,测试组/美工组/产品组/运维组的美眉们聊天呢。
如果这哥们的键盘是有规律,有间隔的,咔哒……咔哒……咔哒,而且面色平静。
那么有可能是在拷贝&粘贴代码。
如果这哥们眉头紧锁,东张西望,键盘隔好一会才敲一会,然又是东张西望。
这才是有可能在开始编程。
用键盘敲击速度来评价的,不是程序员,那是打字员
这个世界,最厉害的编程大佬,只有一个,他的名字叫Jeff Dean。因为他真的不用百度,因为他是Google的大佬。
如果你不是Jeff Dean,但你却是一个程序员。那估计你最好的朋友,就叫Google, 其次可以是Stack overflow。
因为我们都是面向google编程,我不知道大佬们是不是会百度,但他们一定会Google!
真正nb的程序员,不是记住了所以的代码,而是需要写代码的时候,知道去哪里找。
看题主还刚开始,那咱们还是好好打好基础吧,有了一定的基础之后,你的这些困惑也就自然解开了呢。下面的回答时候刚开始入门的小伙伴们。
一个不是很了解CS(计算机科学)的人,该从哪里开始自学CS?
========================= 手动膜拜大佬分割线 ==============
下面咱们来看看Jeff Dean有多大佬吧,都来拜一拜!
Jeff Dean:(也称Jeffrey Adgate Dean)是一名美国计算机科学家和软件工程师,出生于1968年,毕业于华盛顿大学,主要作品有《MapReduce》等。
主要成就:
Jeffrey Dean,简单来说,这货是Google牛逼的源泉之一。因为此人实在太牛了,于是出现了关于他有多牛的几个笑话,直接笑翻,和大家共享下。
当他被Google面试时,Jeff Dean被问及如果P=NP意味着什么。他说,“P=0 或者 N=1”。然后,在所有的面试官还没笑完之前,Jeff瞄了一眼Google的公共证书然后在白板上写上了对应的私钥。
编译器从来不给Jeff编译警告,而是Jeff警告编译器
在2000年后段,Jeff码代码的速度突然激增了40倍,原因是他把自己的键盘升级到了USB 2.0
Jeff还是会在提交代码前把它们编译一遍,不过这么做的目的只是为了检查下编译器和链接器有没有bug
所有指针都是指向Jeff的
gcc的-O4优化选项是将你的代码邮件给Jeff重写一下
光在真空中的速度曾近是35英里每小时,后来Jeff花了一个周末对物理学进行了小小的优化
Jeff出生于1969年12月31日的下午11点48分,然后他花了整整12分钟的时间实现了他的第一个计时器。(背景:计算机中的计时器数值通常被设计为从1970年1月1日0点0分0秒到当前为止的秒数)
当Jeff向以太网发送一个数据包时从来不会有冲突,原因是本来要和它有冲突的包都默默撤回了缓冲区
Jeff对常量的时间复杂度并不满足,于是他创造了世界上第一个O(1/n)的算法。(即随着问题规模的增大,其解决问题所花的时间会越短)
Jeff曾被迫发明了异步API,原因是经他优化后的某个函数会在调用开始前返回
当Jeff写软件时,他是直接码机器码的。写源代码只是为了作为文档使用。
Jeff曾无奈写过一次O(n^2)的算法,其解决的问题是旅行商问题。(该问题是NPC的,即计算机中最复杂最难解决的一类问题,许多人相信这些问题是没有多项式时间复杂度的解的)
Jeff在四子连珠的游戏中能赢你,在三步内
当你的代码有不确定行为时,你通常得到一个段错误或者不正确的数据。当Jeff的代码有不确定行为时,孙悟空会驾着七彩云朵给每个人发免费的长寿仙桃
当Jeff触发程序的程序性能采样时,循环会因害怕而自动展开。
Jeff依然孤独地等待着数学家们解开他在PI的数字中隐藏的笑话
Jeff的键盘多达两个键:1和0
当Jeff失眠时,他Mapreduce羊群。(Mapreduce是Jeff的作品之一,这个分布式处理的框架算法是Google立足的根本之一)
当Jeff听MP3时,他查看其中的二进制内容然后在他脑子里进行音频解码。
当贝爷在沙漠中逮到一个手机时,他发现手机里有个Jeff的未接来电。
当贝尔发明电话后,他发现电话里有个Jeff的未接来电。
Jeff的手表显示的数字是自1970年1月1日0点0分0秒以来的秒数,他因此从来不迟到。
Jeff在开始编程之前,会做'cat > /dev/mem'。(即把输入的内容直接导到内存中)
有一次Jeff出门时错将草图画板当笔记本拿了。结果在他回家取笔记本的路上,他对画板进行了重编程以在其上玩俄罗斯方块
在2002年,Google搜索曾挂了几个小时,于是Jeff站出来手动处理用户的查询请求。搜索准确度翻了番
x86-64指令集中有一些没有被记入到文档的‘私用’指令。事实上,他们是给Jeff用的
27.mantri@mantri-laptop~$ rm -r / rm: cannot remove root directory ‘/’ mantri@mantri-laptop~$ su - jeffdean -c "rm -r /" I am extremely sorry. Removing root directory..
不解释
有次Jeff移位移得太恨了,结果那一位跑到另一台计算机上去了
Jeff从/dev/null那涅槃了。(庞统啊~)
Jeff又从/dev/null那涅槃了。(擦!)
Jeff通讯录的排序规则是按照联系人的md5值
Jeff他不杀进程,他肢解虐杀它们
海底的针会自己找上Jeff
Google App Engine的服务器实际上是Jeff的Nexus S
Jeff的键盘压根就没有Ctrl(控制)键,因为没有什么东西能控制Jeff
如果你命名三个指针分别为爱因斯坦、欧拉和图灵,当你查看它们的指向时,你看到的都会是Jeff
End
程序员噼里啪啦打出来的绝对不是代码,那八成是聊天或游戏呢。我发现初学者都喜欢误解甚至神话比自己水平高的人,总是从表面看事物,不能清楚的认识到水平的差距到底来自于什么。比如我还回答过下面这个问题,你会发现把我回答里的“命令”直接都替换成“函数”或者“代码”来阅读也几乎没有违和感。
这说明什么?这说明这些都是同根性的问题。什么大神为什么可以记住这么多函数,为什么可以记住这么多命令,为什么可以那么快写出那么多代码,为什么可以那么快写出各种命令……等等这些问题都来自于初学者没有真正意识到和你们口中的“大神”的差距在哪。我上面回答中的论点对此问题同样适用,我就不再赘述了,如果有兴趣请移步上面链接去看,把“命令”都替换成你想问的方面。
限制一个人编程速度的绝对不是打字速度(除非你打字一指禅),你用再丝滑的键盘也提升不了你的编程速度,还不如一个真正有效的键盘垫,多少还能减缓你手腕得关节炎的速度。
你身边有一个编程大佬,你天天看着他疯狂啪啪啪敲代码。
你崇拜的不要不要的,自卑的不行不行的。
.......人家也许只是在撩妹子。
讲真,编码能力还真跟敲代码速度没多大关系,更多是算法数据结构、架构思维、debug能力等等。
编程不是打字,并不是越快越好,而是个四两拨千斤的活儿~
不少程序员号称一天能写几千行代码,这种大概率都是水货。
重点说下,什么样的程序员是大佬级程序员:
1.优秀的debug能力
普通程序员:编程我最牛,debug?我不太会!
高级程序员:编程有点慢,debug快速搞定,回家睡觉!
大佬程序员:基本不写业务代码,debug到飞起,全组的bug都由我搞定!
送大家一本算法笔记,这本书是一位阿里技术专家刷leetcode整理出来的,身边不少朋友学习了这本书最终应届拿到大厂Offer:
看看这本书的目录,非常经典
2.优秀的框架设计能力
普通程序员:类结构图和时序图?是什么鬼,需求来了直接撸啊!
高级程序员:写代码之前,肯定先画好类结构图和时序图啊,这样编码会更轻松。
大佬程序员:我的主要职责就是要把框架架构好,类结构图和时序图几乎是必须的!
3.规范的命名
普通程序员:我想怎么命名就怎么命名,代码世界我做主!
高级程序员:形成自己固定的变量命名规则,否则取名字就耗费不少时间。
大佬程序员:命名做得好完全可以起到注释的作用!
4.夯实的算法基础
普通程序员:算法是什么?我不会,但我依然写代码到飞起!
高级程序员:算法太重要了,无论是程序性能还是写出优美的代码,我得继续学习!
大佬程序员:算法和数据结构几乎是编程的灵魂!
顺便送大家一份硬核算法资料,程序员要想进大厂先从刷算法做起是个好方法,算法厉害的人进大厂非常容易,这里送一本阿里P8撰写的算法刷题笔记,身边不少朋友通过它加入大厂:
这本书的目录,非常经典:
5.基本编码素养
普通程序员:特么又编译不过?百度上还查不到解决方案?怕不是编译器坏了吧!
高级程序员:编译不过,查查google上其他大佬有没有遇到过吧。
大佬程序员:编译不过,这块之前好像碰到过,我应该有云笔记,再看看google和各种国外论坛怎么解决的
6.重视自测
普通程序员:什么?让我自测?我这样的天才写出来的代码还需要自测???
高级程序员:交付代码之前反复自测,这样能节省团队时间,也能减少线上bug。
大佬程序员:多写单元测试,多搞搞自测,代码质量自然保证,同时还能提升编码效率。
7.多看书多学习
普通程序员:什么?看书?看多少本书还不如我写一个项目。。。
高级程序员:看书尤其是计算机经典书籍,对提升技术能力技术认知帮助非常大,我有空就看计算机经典书籍!
大佬程序员:攻克那些计算机大部头多有乐趣,并且只有掌握这些知识才能洞悉编码底层原理。
另外我把大学和工作中用的经典电子书库(包含数据结构、操作系统、C++/C、网络经典、前端编程经典、Java相关、程序员认知、职场发展)、面试找工作的资料汇总都打包放在这了,这套资源可不是一般那种网上找的资源,是伴随我从学生一路成长为腾讯高级开发工程师,360技术经理、360技术总监、中小公司CTO的打包全套,非常宝贵!点击下方链接直达获取:
我已经帮大家打包好了,点击下方链接直接获取:
8.重视数据备份
普通程序员:数据备份?权限分离?多麻烦啊,我开发这么快,出问题再改呗,嘿嘿嘿。
高级程序员:数据备份太重要了,千万不能忘!
大佬程序员:权限限制、数据备份、云方案、统一入口、统一管理、监控告警等,这些几乎是必备的,不然真混不下去!
9.记录卡点问题
普通程序员:代码问题解决了,赶紧下班回家刷抖音!
高级程序员:终于攻克这个问题了,我得记录下,下次会更快的解决。
10.谨慎使用新技术
普通程序员:哇,新技术,好酷好炫,我要用!
高级程序员:新技术?还说的这么牛?先测试下,再观察观察,可不能直接用于线上环境。
大佬程序员:新技术哇,很兴奋!这周疯狂玩起来,看看是否适合我们的业务场景!
11.重视warning
普通程序员:warning算个什么啊,一样编译通过快速上线,美滋滋,无视~
高级程序员:认真对待代码中的warning,它们虽然不致命,但却是精益求精的好机会。
大佬程序员:warning极其有趣,它可以帮助我深挖代码中的细微问题,并解决小概率bug。
12.控制不合理需求
普通程序员:需求都冲我来,我是超人,接接接,做做做。
高级程序员:把感觉不靠谱的需求放到最后做,可能到时候需求就变了。
大佬程序员:我需要给产品和老板最合理的需求边界建议,这样可以加快团队速度。
13.积极主动的精神
普通程序员:这个Bug不是我的,我不管,谁的谁负责!
高级程序员:主动改Bug,不管是不是你的,当然,不是你的改完要想办法让老板知道。
大佬程序员:不管我主不主动,大家都会主动找我解bug。
14.重视日志Log
普通程序员:打Log太麻烦了,有这时间还不如多写几行代码!
高级程序员/大佬程序员:Log要尽可能规范,比如要写时间和分类,要能重定向输出。
15.重视计算机英语能力
普通程序员:英语有什么用,我又不去外企,不学!
高级程序员/大佬程序员:多学英语,无论是Google还是stackoverflow,又或者各种官方文档,流利的英文阅读,和习惯性英文搜索,能帮你超越90%的程序员。
16.做好单元测试
普通程序员:单元测试?没做过,有用吗?不是有测试吗,为什么还让我自己测?
高级程序员/大佬程序员:单元测试很重要,它至少有这几个好处:方便后期重构、优化代码设计、文档记录(单元测试本身即是文档)、具备回归性(随时随地测试)。
17.别造无意义的轮子
普通程序员:我就喜欢造轮子,造轮子牛逼就是技术牛逼的最好体现!
高级程序员/大佬程序员:模仿造轮子是学习编码很好的方法,但熟练后就别疯狂造了。
最后,再次推荐这份硬核算法资料,对于程序员而言,算法是重中之重,这里送一本阿里P8撰写的算法刷题笔记,身边不少朋友通过它加入大厂:
看看这本书的目录和排版!相当经典!
要是觉得不错的话,那就帮我 @findyi 点个赞,一键三连呗,硬核码字不易。
Update: 注意了一下真是每做完一个东西要关十几个浏览器 tab
知乎上年薪 7 位数程序员飘过
工作中一样一直在 Google 和 Stackoverflow,偶尔 Quora。百度和 CSDN 是不用的,没用
不只是我,周围年薪几百万,甚至上千万的程序员也是这样
至于题主为什么会有这种困扰,那是因为题主以为编程就是调调 API,做东西熟练,不知道高级点程序员都在干什么,高级软件工程师都是在干什么
程序员都是背很重责任的,或者开发出重要功能,或者解决某个技术设计问题,或者保证服务在特定环境下保持运行,或者扩展底层基础设施,等等等等,大家都是在做高度抽象化,同时严谨落地的东西,至于 API 背的熟不熟,没必要浪费脑容量
没必要纠结这些东西。当然,很多渣渣公司面试喜欢考这种题,类似孔乙己知道某个字多少种写法
都2021年了,你还在用记事本编程吗?
如果不是的,难道你的IDE不会给你提示吗?
经常用的记在笔记软件或者blog上。
不经常用的google。