程序员如何能提高自己的编程水平?
对于在职人员(java举例)
重要的事情说三遍:
一:让自己闲起来,让自己闲起来,让自己闲起来
我先说下怎么做。
第一,提升自己肌肉和神经的反应,甚至到达机械式反应。
比如好好学习ide的使用和快捷键 ,以及一些常用的命令。
你想要写一个实体类:Alt+Insert,shift+ ↓ ↓ ↓(或者ctrl+a全选) ,回车
你要写吧自己代码封装成方法:Ctrl + Alt + M
你想要代码格式化:Ctrl + Alt + L
你想要删除无用的导包:ctrl+alt+o
你想要构建项目:ctrl+f9
自然而然。
第二使用,病不断引入各种偷懒工具
比如
mybatis generate
lombok
比如引入自动化工具,使用excel函数,python工具等 快速处理测试数据。
第三 不要做人嫁衣收集好人卡成瘾,
让产品出文档才开始做,文档没写的一律不做,等待开会。
你要对接别人的,给文档才开发,不给对接文档,一律不开始。
别人对接你的,先开会告知,给出文档,甚至给mock接口,请大家帮我评估下我这个接口对不对,如果没问题我就按照这个做了。
第四好好分析需求,不要打酱油,请提出各种问题质疑产品,遍历所有异常场景和逆向场景,一一让产品砍掉.注意是所有,所有你能想到的和这个有关的都要提出来。
第五,估算的时候不要按照最乐观估算,
老板问这接口多久好?一天做完?好像1小时就可以?这个时候停下。
你做的接口这么完美无缺毫无问题?
所有异常都考虑到了?
所有逆向流程都考虑到了?
没有极端情况?
百分比不会做错了返工?
产品改需求了,领导deadline不变怎么办?
单元测试包含了?自测时间包含了、联调时间包含了?上线时间包含了?审批时间包含了?
大概3天:
如果老板质疑你,指出来所有
先列举出来步骤3的所有点
然后我估算了开发完成时间是这样的:
乐观1天,悲观5天,一般3天,综合考虑(1+5+3×4)/6 三天。
为啥这样?这是行业惯例,是非常多的教授学者专家研究出来的估算方法,国际上pmp,国内软考,二建都是这个。
如果老板同事质疑你的估算,勇敢的拿出你详尽的分析啊,让老板砍需求。
这样比起直接说1天的好处是,报错了,出事了,老板自己的锅,如果你直接估算一天,任何问题都是你的错。
。。如何和领导同事斗智斗勇。。。超出本文的范围。。
好了,你之前想要2小时去做的事情,现在有3天时间。
空闲真的很重要。






二,代码不要一遍写完,代码不要一遍写完,代码不要一遍写完
第一遍 主要业务逻辑
第二遍 主要逻辑中的漏洞
比如xxx=null,用户名为空,xxx属性不合法
第三遍 关联的业务逻辑
比如提交订单改了,会不会影响其他业务,比如优惠卷,比如第三方支付接口,比如通知业务,报表业务。
第四遍,这个业务如何回滚,要不要回滚,这个回滚其他周边业务要不要回滚,一旦发生异常的情况,如何快速恢复?日志要记录哪些?数据要备份啥?第三方的问题,要不要保留调用日志,避免背锅?
第五遍 单元测试以及画图梳理所有分支
第六遍 寻找leader ,产品各种人最终确认你的算法(业务层面)对不对。
三,不要口头承诺,也不接别人口头的需求。
别人非要口头,找领导。
领导沆瀣一气的,你自己记录然后发给需求提出人确认
包含1,2,3
不包含1,2,3
不确认,发邮件 ,主动确认。
没邮件的发微信,直接找真人:xxx经理,这个需求我把握不准,大概梳理了下,你帮我看看?
不确认的,做完了回复一句:你好xxxx,我按照上次说的做完了。
老板说没有不包含的项目,全部做出来,那好
1你帮我一起梳理出来所有的点,我能力有限怕遗漏
2加时间加时间,做不完,抱歉,细节太多了。
好了 ,现在,那你有大量的时间提升你的编码能力了
编码能力有这几块
—————————-
1逻辑思维能力,高效率编码能力,debug能力
这个决定你能不能混。
2业务分析能力,全局思考能力,分析能力
这个决定你在公司混的好不好
3算法数据结构能力。
这个决定你能不能跳槽
4架构思维能力
这个决定你跳槽跳的好不好
—————————-
对于1,我只说重要的,其他说的比较多的我跳过了。。最重要的是写代码咯
你写的代码多了,总会被一个傻逼领导看到,然后骂你一通吧,仔细一想他说的还有那么一点点道理嘛,那就改
你代码写多了,天天controller,service,dao无不无聊?
当然无聊啊?所以你不由自主的会思考我除了这些玩意还能干嘛?或者干嘛能够得到皇上的临幸,哦不,得到leader的肯定。我会不会50岁还在写这些玩意?别人在写啥?别人怎么写的?
最终你会发现这几块:
1阿里爸爸代码规范
2 effect java /thinking in java/on java 等书
3代码优雅和消除if
…….未完待续….
如果你在写代码的时候经常会用到以上内容,或者想到里面的建议,你的代码基本上来说很漂亮了。
代码能力还有一块,应该说是最重要的:debug能力
随便啥代码你都可以debug,甚至跨语言debug,
这看起来很容易其实很难。
这就好像一个牛逼的医生,决定他能力其实并不是开了什么药会不会开药?而是做手术。
比如做一个阑尾切除,剖宫产,癌细胞清理,器官移植。
而程序员就是 能够依靠debug 找出奇奇怪怪bug的原因并修复。
写程序其实很简单,写的不好逻辑正常就行,逻辑混乱能够保证不出bug也还行。
而出现了一个bug,你能找出来,甚至比别人快,别人几天搞不定,你看几眼,搞定。你的逼格就起来了。
我个人最喜欢也最擅长debug了。
我平日低调不与人争辩你说的对,但别人遇到了问题我都会去听一听,说兄弟要不你跑一下,可能你当局者迷,我协助你看看?本来是来划水的,一小心解决了。嘿嘿嘿。
看前面那些规范和书籍可以让写出更少的bug,
而debug能力让你解决那些bug,不光是你,也包括别人奇怪又痛苦的bug。
如何学呢?
第一 为了debug而debug。
比如写一个双层for循环,先猜测第1次循环 变量a=? b=? 输出什么?然后打一个断点看下是不是这样。在逻辑思维锻炼中学习debug
第二 不知道怎么打断点,打一大堆断点,慢慢next调试
第三 先分析可能的原因,然后尝试只在必要的地方打断点调试
当然实在不知道怎么用debug,那就用system.out.println好了。
用好syso也不错。
自己的代码写的多了,然后是看别人代码
1看其他同事的代码,(偷偷)嘲笑他们丑陋的代码,然后思考如果是你,你会写成怎么样?或者说能不能提高结构的可读性,拓展性?
2看框架的源码,里面的一些编码的点可以膜拜一下
比如jdk的注释

比如数组复制用啥?

第三个


先比较长度,不同就快速退出。
长度一样,然后循环比较每一个字符
如果发现不一样直接退出。
还有一个 两个sb谁是线程安全的?能猜出来吗?
或者你有的看不明白,那么打一个断点走一走。
……………..
在你写好自己代码的前提下,看源码,debug源码会让你再次飞跃。
当然我说很多话其实没啥用,就是大家还是要踏踏实实的多编码,竖中指哥说得好:talk is cheap,show me your code。
这块其实不用我来教,去看看其他答主就知道咯。
业务分析能力,全局思考能力,分析能力这块怎么提高呢?
首先,多沟通,了解真正的需求,而且和不同的人沟通,每一个人对同一个需求的诉求还tm不一样,还等整合,如果意见冲突的时候,思考下谁是你“爸爸”(谁决定你的工资,你到底跟谁干活?)
其次,别怕那些高大上的词语
越大的老板越容易给你说一大堆高大上的,虚的很的话。
比如我们这是要做saas哦,我们要保证高可用。
其实呢 saas就是 xxx管理系统
高可用就是挂了优雅的重启让客户无感。
比如你系统很垃圾1秒钟挂一次,但是重启只要花0.01秒 可用性达到了99.99%
接着 警惕各种绝对的词语,我们这个系统很重要,可靠性必须百分100%,(央行,阿里,谷歌都做不到100%,年薪几百万的架构师都无法保证,我月薪5k保证个鸡儿啊。这tm搞笑么)
那么老板说的百分百是什么意思呢,我们害人之心不可有,防人之心还是要有的:
1别tm这玩意出错了投诉到我这,我年终奖就没了。
2这玩意一旦出问题,一定要吧锅甩出去,别影响我年终奖。
3玩意出bug了,大事化小,小事化了,别影响我年终奖。
所以虽然我们做不到100%的高可用,但是
1好好的检查代码,分析各种场景分支,别漏了还是做得到的。
2提前知道哪些地方可能出错,然后找到产品和老板商量对策也并不难。
3对策是你提出来了,体现了你思维能力,对策是老板和产品定的,锅他们自己背。不好吗。
4不知道有啥问题的,那记录好日志行不行,第一时间知道问题在哪,出问题的订单号是哪个。
到事情求助大佬帮忙解决
5真的出问题了,能不能先人肉运维,人肉dba,人肉编码先保证老板的年终奖?哦不先搞定客户的燃眉之急?
6真的出问题了,除了你的问题,会不会有产品设计方面的问题?运维启动的方式?网络波动?还有开源框架的bug等原因?
业务思考模式:可以初步简化为思考一下如何保证你老板的钱袋子鼓鼓的。
怎么说呢?
你在外包公司:思考如何快速复制,快速做完,思考整体上时间最短,思考让客户如果开开心心多交钱。
研究再多高并发,高可用高性能 你老板的钱袋子也不会鼓鼓的,所以他不愿意你去弄。如果你研究方向变成 如何快速写代码?比如你一人可以干3人的活?当然这个可以,你拼死也就这样。但是如果你是一个牧师,你让10个人同时都增加百分30攻击力。那是不是就牛逼了?你的leader做不到,你以他的名义做到了,是不是下一次哪怕你划水他也不会说你了?说不准你有学新技术,给队员套一个10秒无敌的安全输出环境呢,提高容错率。
比如说:
平均 做完一个项目需要一个高级2个初级,做三个月。赚50w。
资本都是贪婪的,需要你不断增长。
只有这几条路:
总价值不变,减少工时
1减少休息时间全员996,但是问题是必然bug率上升,需要项目经理不停的去解决问题,然后出问了要去找客户扯皮,符合公司利益,但是只是基本符合你老板的利益,如何利益更大化呢?
还有高强度必然离职率很高的,这团队效率能高?三天两头有人离职?老板愿意看到吗?
2第二条路,做需求的时候,沟通的时候问清楚所有内容,所有异常情况都一起在明面上讨论,而不是开发一个人意淫。那么问题是不是更可控了,异常场景的业务上真正需求的处理方案 是不是有了?你的3天是真的3天,而他的1天可能会是5天甚至10天。他说1天骗的了几次而已,时间长了,大家都知道他是一个不靠谱的人,做的东西不行,只能靠加班弥补。而你说三天,那就是3天,老板不用担心。
3第三条路,一开始的时候,就让开发直接参与需求会议,甚至售前会议。
销售和商务期间就可以准备起来。特别是技术难点?你如果能够给出方案,领导会不会高看你一眼?
你主动要求参与那些本来没安排你参加的会议。
第一提升老板的好感值
第二让你知道更多业务细节,信息的传播有很多噪音和丢帧,导致你做出来的不对,但是程序员处于弱势地位,到时候锅甩给你。如果你一开始就去沟通了解需求,那就不好甩给你了,而且你的工作更高的概率做的事对的。
第三,让你有准备。一个是技术上的准备,第二个是心理上的准备。
这个1,2,3本质上是减少项目的整体人天。
还有一个高招,是我在外包公司玩的。
那就是 用你的技术触动客户,并让客户持续消费。
比如做了一个管理系统,才50w,合同签的需求50个,随着不断深入,客户懂了,增加各种需求,导致最终需要做价值100w的100个需求。你的老板可不愿意,只能压榨你。
而如果能够抓住最关键的需求,其他的延后到所谓的二期。岂不快哉?
但是你的老板 项目经理一个人搞不定的,所有团队成员都需要
1挖掘客户真正的需求,比如客户要求excel导出,但是数据量太多了,好几个g导出了干嘛?而且导出了也打不开啊,还是会怪你。稍为拓展一下,结果啊发现是客户是想要吧这些 数据导入到另外一个关联的系统。他是业务只知道手工输入。于是他只给你3个月,因为他导入数据检查数据还得花3个月呢?
那既然是为了导入数据是不是可以这样呢?
直接写入到对方的数据库,
或者调用对方的接口?
或者是 excel性能不好 导入文本文件或者csv呢?
或者说excel 这么大,对方系统大概也会报错导入失败啊。那可不可以吧单个excel变成n个小excel,然后用自动化脚本依次导入呢?
这是一个真实的例子。。。。客户采纳了我的意见2。时间是宽松了很多,大文件excel问题解决了。
然后这个客户还签了补充需求协议,三期优化合同。
老板的钱袋子变得比原来更鼓了,公司利益最大化,客户的利益也保证了。
如果你在一个甲方公司,那你需要思考你的代码
1如何准确的,可控的执行
2如何保证这个业务不出错
3如果出错了,怎么保证伤害最小
4如果出错了,怎么保证责任分明
5如果这次出错,下一次不会再次出错
6如果这次出错,下次也会出错,能不能延长出错的间隔或者出错的概率
7如果啥都做不了,证明你尽力了,而不是当了逃兵。
3算法数据结构能力。
稍微好点的公司,基本都会靠你算法数据结构。
这玩意实在不会,那就背住吧。
不过呢,你需要不断写代码然后思考,比如这样
现在要求不重复的list, set不可重复,可以用它。
现在要求查询快,arraylist 现在要求插入快 linkedlist
我呸,你测试过没,差不多的,arraylist还快一些。
为啥呢,听说是arraylist更好的利用cpu缓存。
那linkedlist有啥作用呢?需要固定顺序的时候用。
hashmap啥时候用?
concurrenthashmap啥时候用?
4架构思维能力
这块是这样的,
……..
谢谢大家,未完待续。。。。。。。。
有啥问题可以找我咨询哈。