笔者不同意下面网友的回答。
程序员如果
解决bug的水平停留在百度,那么本质上只是一个“面向搜索引擎的代码搬运工”,是不合格的程序员。 程序员对面bug,正确的“打开方式”是像福尔摩斯和柯南那样,寻找线索、运用逻辑推理来缩小问题可能的根因范围,最终精准定位。 常用的方法有: 1. 坏境上下文变换法 2.
工具调试法 3. 版本回溯对比法 4. 代码审计法 ……没有编程问题是stack overflow和Google解决不了的,假设你在编程中遇到了问题,你自己解决不了、你周围的的人都解决不了的时候,我觉得stack overflow、Google是你最好、也是最后的帮手。 作为一个程序员,我觉得Google、stack overflow是你必须要学会使用的两个工具,这两个工具本身并没有使用门槛,只不过因为一些众所周知的原因,很多人不能使用Google和stack overflow这两款工具。 Google主要还是方便,而且很多编程问题都需要用到英文搜索,当然现在百度在专业能力上也提升明显,不过跟Google也还是有比较大的差距,因此我还是强烈建议要学会使用Google,这会帮你在工作、学习上事半功倍。假设Google确实因为某些原因没办法很好的使用,我也建议你至少要会使用Bing搜索。 现在可以说stack overflow上没有你找不到的问题了,从IDE环境安装问题,到各类编程语言问题。算法问题,数据结构问题,调试,重构等等,几乎这里就没有你找不到的答案,可以说在stack overflow上你可以找到任何解决方案,并且上面的回答者基本上都是非常有经验,而且都是实际中遇到的问题分享出来的,这个工具一定要会使用。同理,除了stack overflow这个专业的垂直程序员问答社区,你也可以使用Quora这个综合问答社区,这上面也能找到很多问题的答案。一些比较优秀的文本编辑器: Emacs/Vim,Visual Studio Code,Sublime Text,Atom,Ultraedit,Hbuilder等。一些比较非常出色的IDE集成开发环境: visual studio,IntelliJ IDEA,PhpStorm,Haskell for Mac ,eclipse,WebStorm,GoLand,CLion,Android Studio,Xcode,QT等。macOS平台比较好的第三方包管理工具: Fink,Macports,Homebrew等。一些比较好的终端工具: Zoc7,iTerm2,Cmder,terminus,hyper等。一些比较好的笔记软件、markdown工具、效率工具: Evernote,有道云笔记,为知笔记,Ulysses,MWeb,FileZilla,Snipaste,Kantu等。虚拟机软件、容器软件: Parallels Desktop,VMWare Fusion,Virtual Box,Docker等。 我是个程序员,职务是linux底层驱动工程师。平时的主要工作是调试驱动,但产品遇到诸如死机、重启、不开机之类的问题时,也要参与查找原因。一部分问题,确实可以查看相关的log,然后百度这些log的关键字来解决;但更多的问题,牵扯的条件太多,并不是简单的百度就能解决的。 观察了周围同事们的做法,我总结出以下几种解决方法:百度因为竞价排名的原因,搜索出来的结果有很多广告的成分,所以有时候要翻好几页才能看到一条相关的答案,有些甚至要翻几十页。 因为百度搜索使用的是SEO技术,即普通用户可以通过优化网站内容来提升关键词排名。 而这就会导致一个问题:你搜索关键词后展现出来的结果是有人想要让你看到的,并不是质量最好的。 也就是说,百度搜索结果被人为干预了。所以百度一直被网民所诟病。 但百度搜索不出结果,未必是百度的原因,也有可能是自己输入的搜索词不准确造成的。所以对于百度,我们要做到如下几点:除此之外,百度搜索还有点小技巧,粥左罗《万字干货,彻底讲透搜索技巧,10倍提升你的搜索力(免费教程)》这篇文章写得非常好,我整理几点,仅供参考: 01 过滤目标内容命令:“+”“-” 用法:通过“+”和“-”来对搜索结果进行过滤 比如在关键词后加上“-推广 -推广链接”就可以排除搜索结果中包含相应字样的链接。如果你发现广告还没有排除干净,你也可以再加上“-广告”通常就能彻底的消灭广告。02 搜索包含某关键词的内容命令:“intitle” 用法:通过“intitle”命令指定搜索结果中要包含的关键词,注意“intitle”后边连接的冒号是英文状态下的。03 搜索某一个格式的文件命令:“filetype” 用法:通过“filetype”命令可以限制我们要搜索文件的类型,注意“filetype”后边接的冒号也是英文状态下的。04 搜索特定时间范围的内容命令:“时间..时间” 用法:通过“时间..时间”命令可以限制我们要搜索的文件的时间,注意两个时间的中间顿号没有空格。 相对百度,谷歌、必应对于技术搜索,就相对准确许多,所以当你百度搜索不到时,尝试下别的搜索引擎,说不定会有新发现。现在程序员使用的机器语言,都是国外的,更准确的说,都是美国的。所以很多论坛、资料等,都是英文。如果你只会用中文来搜索,某些小众的问题,当然搜不到啦。 所以,要学会使用英文关键字来搜索。 有时候甚至要去国外的一些论坛来搜索想要的答案,这就要求要有一定的英语阅读能力,不能一看到英文帖就放弃。有时候不管你如何搜索,都找不到自己想要的答案,该怎么办呢?这种情况下,就只能硬着头皮尝试自己解决了。 或者,寻求同事或朋友的帮助,寻求大脑风暴,说不定就会有思路。 如果有些问题是因为新器件带来的,还可以找到器件供应商,让他们安排技术支持帮忙查找原因。 除此之外,还可以把问题整理好,写清发生的条件、复现步骤、测试方法、相关的LOG截图等资料,去一些技术论坛发求助帖,寻找大牛的帮助。做技术时间久了,发现有些问题确实无解,根本没有办法去解决它。这时候,我一般会尝试把它绕过,就是说,想办法让它无法复现,虽然问题还是存在,但是能把它掩盖过去。比如有些驱动在开机启动时会加载不正常,那么就让它晚点启动,或者手动加载。这也不失为一种解决问题的方法。 以上就是我的建立,希望对你有帮助。首先作为一个程序员,一个优秀的程序员最最最重要的能力就是解决问题的能力。这里解决问题的能力当然就包含了解决 bug 能力了毕竟,程序员这一生,可能会写无数个 bug ,没有说哪个程序员敢保证自己写的程序没有 bug 。 所以,写了 bug ,遇到 bug 并不可怕,可怕的是你没有解决 bug 的能力 。作为一个程序员,解决 bug 的途径有哪些呢?我们来一起聊一聊!其实,每个程序员在学习编程的时候,都会使用编程工具,而现在的开发工具,其实功能都很强大。如果你自己合理利用编程工具,都了解和懂得开发工具的一些技巧,其实不仅仅能够提高开发效率,而且还能够帮助你解决很多编程中的实际问题。debug 调试,大部分你常用的开发工具,都会有调试模式的,简而言之,就是你编程的时候,遇到了不是自己所想的结果的时候,你可以使用 debug 模式,来一步一步的调试,在调试模式下一般每一步都会显示所执行的结果,你可以看看在哪一步出错了,执行的结果与你预想的结果不对,那么你就能够找到问题所在了。还有就是,开发工具的控制台,都会提示出报错信息的,现在的开发工具,都会直接告诉你哪一行,报了什么错。其实,很容易定位到错误的。你只需要在编程的过程中积累经验,知道报什么错,用什么方法来解决就行啦。可是,提示的报错信息,我不知道用什么方法来解决的时候,该怎么办呢?这就是你需要积累的,也是问题中所描述的,就是通过搜索引擎来找答案。不对,这里不应该是合理使用搜索引擎,应该是学会正确使用搜索引擎。比如:百度,你就不要用了,搜出一堆重复的信息,而且广告也多。作为程序员,建议你使用谷歌搜索。其实,你在编程中所遇到的几乎所有的问题和 bug ,别人也同样遇到过,因为不管是经验丰富的老程序员,他技术再牛逼,也是初学者过来的,也都踩过你踩的坑。所以,互联网是个好地方,里面包含了你想要的问题的答案。你只要把报错信息往搜索引擎上一放,回车一下,很多关于这个 bug 的答案就出来很多,你只需要找到跟你一样的 bug ,就能找到答案了。在这里必须提一下这个网站,所有的程序员有必要学会使用这个网站,其实,你编程中所遇到的问题,这个网站上几乎都是由解答的。Stack Overflow 可以说是最好的软件程序类问答网站了,给软件开发人员工作和学习提供了非常大的便利,以至于像小白,离了 Stack Overflow 简直都不会写程序了。所以,建议大家一定要学会使用这个网站,对你编程肯定会有非常大的帮助的。通过上面的方法,几乎应该能够解决到你所遇到的问题,但是,实在找不到答案的话,你可以问经验比你丰富的老程序员,实在解决不了,那就换种方法吧!百度,谷歌,debug,断点调试,业务上的bug就需要问下同事或者产品。如果能知道大致范围,哪一部分错了,就换一种方法呗,一般都不会只有一种方法。 1.reload 2.restart 3.rewrite and then goto 2 or 4 4.reboot 5.rm -rf / 6.原谅我编不下去了[捂脸][捂脸][捂脸][捂脸][捂脸][捂脸][捂脸] 找bug跟医生看病的思路是一样的,要对症下药。得先把问题的根源找到,找到根源以后问题就容易处理了。搜索引擎找不到的问题,说明这个问题不是一个常见的问题,具有独特性,那么从bug出现的路径上一步一步去排查。必要时可以用排除法,尽可能的缩小排查范围。另外,当软件的业务逻辑比较繁多复杂的时候,一个结构清晰的架构能为你节省不少找bug的时间。还有,充分的单元测试能够帮你减少出bug的机会。以上均为个人看法,欢迎讨论! 一般程序员能碰到的bug无外乎其他上游程序员写库时手抖留下些不匹配或者容易溢出的问题,搜一下差不多能解决问题。如果是自己写的,那无非就是时序错误类型错误之类的,用break point一行行的调就好了。 再复杂点的bug就是程序员拿高薪的根本了,只可意会,不可言传~仅仅靠搜索引擎、其他网站那必然无法解决大量问题,因为很多问题是跟业务逻辑相关的,是没有直接答案的。比如 游戏 开发有个界面一直无法显示,这个问题就不是百度可以解决的。问题需要调试分析,这和破案非常像,但在开发过程中更有利的是问题有机会可以重现。破案是逆向工程,需要反推。解决代码问题不仅仅可以反推,也可以通过阅读代码正向分析。下面说说如何debug一个业务逻辑问题。回到刚刚的例子,有个界面一直出不来,我们如何快速去定位: 1.思考这个问题发生的可能性。比如 游戏 内大量界面都是正常的,那么可以对比正常界面代码和异常界面代码的区别,这是对比法。 2.假设创建正常界面和这个异常界面的逻辑代码是一样的,那么问题就落到了这两个界面内部,继续在内部重复上面的对比法进行判断,直到锁定最终位置。 上面说的方法基本上可以杜绝卡在一个简单问题上,这是摆脱新手的一个过程。选择使用对比法或者其他方法的前提都是基于观察和对项目的认识,所以,搜集“案发现场”是最关键的。 其他的问题,不属于逻辑的,像其他网友说的那样,有些通过到github、stackoverflow等地方解决的。这些问题也不是直接就去查找的,它通常也有个分析过程。比如你使用了一个库,但是目前它不支持你的模块。对于新手,就是直接百度或者google了。实际上这样的问题也是有“案发现场”的。对于作者提供的api接口的统一性和便捷程度去推断作者在相关支持模块的位置以及命名以及拓展,再尝试在文件夹中搜索。如果都找不到,再去Google上获取更多的信息。重复推断、分析,决定如何拓展或者绕过。 综合上面的几种问题,可以看到的是都离不开对现场的观察和推理分析。这种能力也被称为经验。但是一般情况下你看不到它们这个分析过程,你能做的就是在实际环境中反复逼迫自己去思考,去训练。这个推理的培养,不仅仅是对事情,也是对人。 我在入行 游戏 开发的前期,也是类似的情况。卡在不同种类的问题上,有些在简单逻辑,有些在别人的代码支持上。后面解决的问题多了,就会发现里面共通的思维方式。常用的一些方法如下: 1.对比法,比较正常与异常代码区别 2.二分查找法。分段注释找问题,也会用在很多方面。比如最近版本突然出了一个奇怪bug,可以通过svn还原来定位。这个还原不是一个一个版本还原,而是用二分法去还原。 3.增加信息。在怀疑的位置或者过程添加日志或者打断点辅助自己更好的推理。 4.相似推理。比如一个引擎在api、性能使用程度上都非常友好,那么它在别的地方也有可能相对表现比较好。这时候如果有个功能我们的实现需要很复杂才能完成,那么就有可能是我们用错了。相似推理不一定都能正确,但会提供一些帮助。 以上。本人是一名 android display方面的工程师,结合实际工作经验聊聊(观点未必正确)
1. 准备工作:选择什么样的版本,使用什么样的工具,这个需要考虑好。
如果是要参考书的话,kernel版本一般都应该选择和书里面同步的版本,不要去选择最新的版本。因为最新的版本,各种改动比较多,反而对不上书了。
工具问题,你可以选择windows下的source insight,也可以选择linux下vim+ctags;
2. 第一遍浏览,我建议是先把kernel里面的 start_kernel() 函数里面的东西看清楚(不一定看明白),看看这个过程中,出现了什么玩意,有哪些分支,并将分支初略的画出一张图来(当然,我自己并没做到这一点,有点讽刺了)。
这里面最重要的几个地方,我个人认为,应该搞明白module机制,它是怎么通过编译链接脚本放在特定的区域,然后系统起来后,又是如何去(按照什么规则)去加载这些模块;
应该搞明白sysfs系统,这个对于驱动和用户空间的连接,有非常大的作用;
系统调用的open()应该走一遭,看看用户空间到kernel之间参数是如何传递,又是怎么通过vfs系统,把open的动作最终落实到某一个驱动的open()上去的;
对kernel启动过程中,内存的分配算法,是怎么从伙伴算法切换到最终的算法上,也应该略有耳闻;对fork()函数的过程有所明白。
对kernel中基本的数据结构实现过程、锁机制实现过程要有概念:
这一部分,总结起来,应该看的路线是:
start_kernel()
module_init() 宏实现 // 看这个的时候,强烈建议,把makefile真正的意图弄明白
open() 系统调用
fork() 系统调用
sysfs 框架实现
双链表是如何实现的
锁最终是依靠什么来保证的?(其实还是硬件来保证的)
对于数据结构和锁这部分,就按照《Linux内核设计与实现》里面的东西挨个挨个看。有兴趣,自己也可以实现一个双链表公共API,随便哪个项目,一旦用上,直接抛进去,也未尝不可。
第一遍浏览,窃以为,上面这几部分看明白后,kernel的代码对你依然很难,但已经不再有神秘的面纱。
后续,你想研究某个模块,直接快速定位到那边去就行。
3. 在完全用眼睛看完上面这部分内容后,kernel的路或许找到了,但是,万里长征的第一步,并没有迈出。这个时候,动手是很重要的了。
网上有各种方法,比如说,去kernel maillist里面订阅bug,然后自己试着解bug,此方法可取,而且是非常好。这里会遇到一个问题是,我们该怎么调试?
有人是架各种虚拟机或者多台物理机一起开干,这个可以有。(但是本人动手能力确实有限,这个没干成,本人是后面借助了公司的开发板)
如果你也像我一样,动手能力不足,如果你恰巧是手机或者类似手机开发公司的,你可以直接使用公司的开发机,通过串口log,将printk()的级别设置为3,把你需要的信息打印出来;
如果你是学生或者爱好者,可以花500左右人民币,去淘宝上买一个开发板,也是带串口的,所有的debug信息都是通过串口打印出来,保存到一个Log文件中,然后分析;
至于买什么样的板子,你可以随便选择,经典的s3c2440也行,高端点的树莓派,或者全志什么的,都可以。(不推荐全志,他们添加和修改硬件比较多,驱动也许不好搞)
4. 选择你喜欢的模块,进行深入研究,通过log打印,反复推敲,这个时候,bug是最好的导师。多关注kernel/Documents/ 目录下的文档。
你需要注意的是,一定要把该模块无关的东西砍掉,否则,生命是有限的,而代码是无限的。
最后一句话是,在用眼睛看完后,思考过后,还得动手,然后再思考。否则,只读的话,仅能扫盲。
Why do most of the developers in Silicon Valley prefer OS X over Linux or Windows? 为什么很多硅谷工程师偏爱 OS X,而不是 Linux 或 Windows?
【重要】:这就是本文标题的由来!
那位题主还补充说:
「看过许多诸如 Google、Dropbox、Quora 等公司的视频,发现有超过 90% 的工程师都在使用 Mac。Mac 为什么这么流行?难道大家没发现下面这些问题嘛?」
昂贵但 GPU 性能一般!
没 Linux 开放(Linux 允许你编辑任何文件)
服务器是运行在 Linux 上的,在 Linux 上开发岂不更好。
原本小编以为这个 Quora 帖子的最 zan 回复会详细列出 Mac 优点的。但是万万没想到,原帖中被 zan 最多的,却是一个偏爱 Linux 的程序员。其他被 zan 比较多的回帖,也偏向 Linux。
Mike Mikowski 的回答,2700+ 顶
我觉得以上大部分原因跟问题并不相关。
图中的这位,显然认为把 Linux 作为自己的首选 *** 作系统,这是个非常好的主意。
他就是 Jeff Dean,在过去十年中为 Google 创造了数十亿美元的收入。
我们俩的桌面看起来很像:
作为硅谷的一名高级架构师,Linux 和 OS X 我都在使用,但 Linux 更适合我。我坚信 Linux 应该被普及。说实话,OS X 在某些方面的确比 Linux 好,但这优势已经越来越小,因为 OS X 的缺陷越来越多了。
我相信,当工程师花 2500 美元买了一台 Macbook Retina Pro(16 GB 内存,Intel Iris Pro Graphics 图形处理器 和 AMD Radeon R9 M370X 图形处理器),就会发现 Mac 并没有比 Linux 优秀。随着 Mac 硬件(GPU)进一步落后和软件质量下降,我能预料 Linux 的普及。
让 Linux 普及的要点是可定制以及厂家的支持。这将解决硬件兼容性问题,启动时再也不会出现“just some old hardware”的提示。我现在用 System76 的笔记本和台式电脑,他们的电脑和售后非常好。我其中的一台笔记本 Oryx Pro 配置如下:搭载 GSync 技术的 GTX970m 显卡,固态硬盘, i7 处理器,32 GB 内存和 IPS 显示器,一点也不比 Macbook Pro 差。同时,我维护着一份 Kubuntu 下装机必备软件列表,欢迎评论和补充。
以下是我为什么用 Linux 开发和个人电脑的原因:
1.强劲的 GPU 和 CPU。我的家用电脑和笔记本都配了顶级的显示器和 GPU。Steam 上有 2000 +游戏,我和孩子玩了很多,并且我对 CUDA 和 深度学习很感兴趣。而 Mac 对此就无能为力了。对我来说,强大的 GPU 是非常重要的,所以我配了一台搭载 GTX980Ti 显卡、32 GB 内存、3440×1440分辨率的曲面屏、i7 WildDogPro 处理器的电脑。而价格跟 MBP Retina 的价格相差无几。
2. 与服务器真正的兼容。我曾工作过的一家公司,半数脚本是用 Linux 脚本和 GNU 工具写的,另一半是 Bash 和 BSD 工具写的,因为这部分开发者坚持用 Mac 开发,并认为 Mac 和 Linux 相差无几。我只想说,这真的太乱了。后来,我花了几周时间重写了代码(为了兼容)。这些人一边说:“Mac OS X 是不同的”,但另一边又说:“Mac OS X 跟 Linux 相差无几”。但事实并不是,Mac OS X 与 Linux 差很多。
3. Linux 使我更高效。几乎不需要切换环境,我可以使用相同的工具,专注编写脚本,与服务器无缝衔接。至今,我还没发现哪个 Mac 用户能展现出令我印象深刻的 脚本编写能力。我曾经管理过一个需要超过 100 台以上 Linux 服务器集群的软件,除了 Linux ,其它系统根本胜任不了这个任务。
4. Linux 上一切允许正常(Everything just works)。相对那些用 Mac 的同事,我在 Linux 上碰到的问题更少。不需要安装 homebrew、fink、MacPorts,只要运行 suao apt-get update 和 sudo apt-get upgrade 这两个命令就可以了。团队里有少数人还在坚持使用 Mac,他们认为这是一种荣耀。编写脚本和程序设置电脑, Mac 大概要 2-3 天,而 Linux 只要一个小时,而且几乎是全自动化的。
5. Linux 能做 Mac 不能做的事。有一天,我们需要超高清分辨率的屏幕截图,在 Linux 上只要输入: $ xrandr --output DP-2.8 -s 3440x2880 --panning 3440x2880 ,之后用 Chrome 把图片放大一倍,并用 Ksnapshot 获得所需图片,前后只需要几分钟。谁能在 Mac 或者 Windows 上实现?
6. “Linux 上不能运行商业软件”这个争论是毫无意义的,尤其是在硅谷,这里早就不使用微软的 Office 软件了。我使用 Balsamiq 3、Slack、DropBox、Chrome、Hangout、Google 办公套件、GoToMeeting、WebStorm、Skype、Gimp、Insync等软件…对了,在休息时间我会在 Steam 上玩会游戏。所有程序都运行良好,几乎没有应用程序或者系统崩溃。Webstorm(JetBrains IDE)在 Linux 上更友好,同样,NodeJS、MongoDB、MySQL和其它一系列开发工具在 Linux 都比 Mac 友好。
KED/Plasma 的界面比 Mac 和 Windows 都友好多了。你问我为什么这么说,因为 KDE/Plasma 我都在使用。
这么多开发人员缺乏系统管理和使用脚本的技能,真是一件令人沮丧的事。相对命令行来说,Mac OS X 的图形界面限制了程序员的思考。如果有一天我在硅谷创业,我会把 Linux 当做首选的 *** 作系统。
注:
CUDA:一种由 NVIDIA 推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。
deep learning:深度学习。源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。需要 N 卡支持,而 Macbook 基本上配的都是 Intel 显卡。
评论列表(0条)