程序员的观察力
来源:互联网 发布:spss软件如何下载 编辑:程序博客网 时间:2024/05/17 23:41
昨天代码运行不通过,是因为在copy代码的时候多copy了一个配置,导致springboot的tomcat报安全错误。
小错误后果却相当可怕,直接导致月末的蛋糕吃不着+晚饭没吃+可怕的继续加班。
问题经过
当时是这样处理的:
- 1、怎么运行不通过?找找网上报这个错的解决办法。
说是安全错误,内存溢出
查出了这个错误,解决办法都是说mysql的连接导致。。。
放弃了这条线
- 2、找找其他的解决办法
这是个错误思考方式,因为1还没走完,就走2会使得事倍功半,而且1这条路废了。
所以就有重新看了一遍spring boot 支持https和http的解决方式。
网上的解决方式还真不一样,baidu的样例程序是同时启动两个java程序,分别处理http和https
儿网上的解决方式是在tomcat中新加入一个connector来处理https。百度的好像是有类似代码的,只不过api不同。汗。。
看来网上的评论是对的,那篇文章api过时了,我还傻了吧唧地研究了半天。
本来想直接copy网上代码,不过感觉这样会破坏百度的程序,引入不靠谱代码,还是放弃了。
后来想想,这样做是对的
- 3、放弃了2线,只能走最原始的方式,和git上对比,找不同。因为git的代码是可以运行成功的。
直接git clone到本机,生产一份新代码,可以运行。说明和机器无关
把java代码去掉,保持和git上一致,还是不能运行。。。
那剩下代码只有脚本和单侧不一样了,那是什么原因呢??
愚蠢的我想也不想,就把单侧代码删掉了,原因是单侧之前导致build不成功了。
还是不行,那就只有脚本代码了。build代码分成两部分,一部分原来的,一部分我新加入的。
把我新加入的去掉,居然可以运行。。。
但是愚蠢的我到目前还是抱着侥幸心理,还没看出问题
这里必须把代码贴出来了:
原来的start.sh是这样的
function main() { checkApplicationExist checkJDKEnv nohup java -Dspring.config.location=$SPRING_CONFIG_FILE -Dfile.encoding=UTF-8 \ -Xmx$MAX_MEMORY -XX:MaxPermSize=$MAX_PERM_MEMORY -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps \ -Xloggc:gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=20M -jar $APPLICATION > /dev/null 2>&1 &}
因为我想加入ssl的配置,同时多启动一套Java程序,修改后代码是这样的:
function main() { checkApplicationExist checkJDKEnv nohup java -Dspring.config.location=$SPRING_CONFIG_FILE -Dendpoint -Dfile.encoding=UTF-8 \ -Dtomcat.ssl.port=8921 \ -Dtomcat.key=/User/baidu/key.p1 \ -Xmx$MAX_MEMORY -XX:MaxPermSize=$MAX_PERM_MEMORY -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps \ -Xloggc:gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=20M -jar $APPLICATION > /dev/null 2>&1 &}
草,明明这里除了ssl的配置还有一点不同啊,就是-Dendpoint,这TM都看不见。
最后还是愚蠢的试了若干遍,为啥把下面两行ssl配置去掉还是不能运行成功。
最后用idea的查找工具进行上面和下面代码的对比,终于看到了这段多出的配置。
配置移除,运行成功。
反思
首先,程序员真的需要培养一颗敏感的心,一个敏锐的观察力。你在写代码的时候,一定要注意代码之间的差别,切忌想当然,侥幸心理。 严谨严谨!!
对生活也应该如此,一定要注意到每天的变化,网站,日报,技术等。想想看,一个对周边环境毫无感觉、不能把握周围产品变化的人,做程序员只能是干体力活了,只能是听别人说,吃别人嚼过的饭,没有自己独有的产出。
注意,写博客也是一个能培养观察力,把控全局的修炼。
其次,在遇到这个问题后,我没能有一个正确的处理问题方式。
一开始找报错原因,这个不对。
一开始应该先反思自己的程序问题,看看自己代码copy过来是不是正确,如果一开始找到了这一行,那就不用花一个下午,饭都没吃来坑自己了。
所以,方式1,最终是无果的,因为百度出来的都是mysql的错误,和当时犯下的错误没什么关系,白费劲。
这样,还是一样,程序员需要观察力。
网上有不少训练观察力的方式,而程序员观察力的训练,就是一点,看代码。不能笼统地看,要一行行地看,先有整体把控,再对每个细节熟悉。这次是细节踩坑。
而后,再找报错无果后,转而去找其他方式,这个也错,但又错的不离谱。因为,想想看,一个找不到根本解决办法的人,不就是只能到处天马星空baidu去吗?这是一种方式,但是是绕远的,不解决根本。
我没有采用第二种的极端做法,copy网上的代码,因为我觉得和网上的代码比起来,baidu的还是更靠谱些。后来证明,这步走对了,避免更大的时间浪费。
这里再补充一句,写代码过程中,应该先动脑子,再动手。不能一上来手比脑子快。记住。。记住。。
最后到了第三步,只能回归最原始的方式,一行行去掉不同代码,大家来找茬。
坑爹的是,到最后都要给自己挖坑,明明已经到了答案的门口,却还是要绕道走进门。又是没动脑子+侥幸心理的后果,懒惰真是可怕,可怕。
再总结
程序员一定要多想,多观察,多思考。
在遇到一个问题之后,一定要根据问题现象看本质。
比如java里面的异常,首先应该看异常说的是什么,连异常是什么都不看就去漫天百度,这不是傻是什么。
然后就是,在处理问题的过程中,需要时刻向问题的根本靠拢,不要总是漫天寻找问题答案。
想想从总体到分简单,还是从分到总简单?
从抽象入细节简单,还是从细节到抽象。
一定要先总后分,这个“总”就好比一颗大树的根,时刻把握住这个根,找寻周围的叶子,能少走不少弯路。时刻记得,这是节约时间成本的关键。
剩下说说具体该怎么整吧:
遇到问题,先想15分钟,把这个问题的现象描述清楚,为何出这个现象,可能导致这个现象的原因(自己想,不去百度,想出5条,选择其中最可能的2条,根据这2条去百度)。
当然,这个前提是要对代码特别熟,代码是相当于问题的根,而问题的原因是相对于问题解决方式的根。
所以,解决方式出来了,先看明白代码,包括代码环境jdk,tomcat,springboot等。当然,这个有难度,那可以降下,先看一部分,比如springboot,先解决最主要矛盾。
看明白代码之后,应该就是上面说的,看问题,找原因,冥想。
这样,在想清楚之后,脑子里应该有了一两条可能的原因了,根据这个去百度解决方式。
还有一个重要的,百度什么??
一般人都是去百度一个具体错误,比如java里一个exception,包括这个错误的上下文。这里不建议这样,这是无可奈何之举。应该百度你想出来的2条原因,根据这个找问题解决,也就是百度大树的“根”,不要百度“叶”。
当然,百度完了,还是要再想,再找百度出来解决方式的根。
实在不行,再百度叶子,具体错误。
总结成一句话,多想,在解决问题的时候,不要迷失于细节,时刻注意在深入细节一段时间之后,回归问题的本质。要广度优先为主,深入优先为辅助。先广后深。
所以,不要为这次加班没吃饭而光荣了,纯属无效加班,完全自己造成的问题。坑了单位,关键坑了自己。
- 程序员的观察力
- 观察力
- 观察力
- 中钰睿泓:观察力才是最基础的能力
- 五个方法练习你的注意力和观察力
- 真的还是PS的?来测试下你的观察力吧
- 五个方法练习观察力
- 怎么样提高观察力?
- 观察力训练(福尔摩斯演绎法)
- 思维导图总结:怎样用观察力强化记忆
- codeforces 231B Magic, Wizardry and Wonders(超强技巧+思维+观察力)
- 程序员的歌:简单程序员
- 程序员的歌:简单程序员
- 程序员的歌《简单 程序员》
- 非程序员的程序员生活
- 程序员是不是好的程序员
- 不想做程序员的程序员
- 资深程序员:程序员的困境
- Sky Map
- Spring4笔记----动态代理
- 软件设计架构之DDD,SOA,原始,REST,Actor,CQRS
- PyGobject(四十二)布局容器之ButtonBox
- 反射+注解或去数据库查询语句
- 程序员的观察力
- mysql 通过bin-log恢复数据方法详解
- Linux 文件权限管理 之 RWX
- 利用JAXBContext将xml文件转换成List<T>
- 浅谈Java反射(1)
- KMP算法
- Spring从入门到精通视频教程合集
- hdoj 1010 Tempter of the Bone (dfs 奇偶剪枝)
- Lucene学习笔记之(五)lucene的特殊查询