程序员的观察力

来源:互联网 发布: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条原因,根据这个找问题解决,也就是百度大树的“根”,不要百度“叶”。

当然,百度完了,还是要再想,再找百度出来解决方式的根。

实在不行,再百度叶子,具体错误。

总结成一句话,多想,在解决问题的时候,不要迷失于细节,时刻注意在深入细节一段时间之后,回归问题的本质。要广度优先为主,深入优先为辅助。先广后深。

所以,不要为这次加班没吃饭而光荣了,纯属无效加班,完全自己造成的问题。坑了单位,关键坑了自己。

0 0
原创粉丝点击