心得与经验

多快好省

February 26, 2020
心得与经验

经常会有一些不懂软件开发的领导,幻想着可以“多快好省”地开发出软件。

[机翻]如何解决问题

October 21, 2019
心得与经验, 机翻

此为机翻文章, 原文在此。 解决问题方法 # 当遇到新问题时,你该怎么做? 1.理解、明白 # 确切的知道要问什么。大多数难题之所以难是因为你不理解它。 怎么知道你理解一个问题呢?当你可以简单的术语解释它的时候。 你还记得吗,当你被一个问题卡住,你开始解释它,你会立即发现以前从未见过的逻辑漏洞? 多数程序员知道这种感觉。 “If you can’t explain something in simple terms, you don’t understand it.” — Richard Feynman 2.计划 # 不要没有计划就直接解决问题(以某种方式希望您能摸索到底)。规划您的解决方案! 如果你不能写下具体的步骤,将无济于事。在编程中,这意味着不要马上开始写代码。要给你的大脑时间,处理问题、分析信息。 为这个为题给出一个计划: “当输入X时,有哪些必要的步骤才能输出Y?” 旁注:程序员有一个很棒的工具来帮助他们。 3.划分 # 请注意。这是最重要的一步。 不要试图解决一个大问题。你会哭。而是将其分解为多个子问题。这些子问题更容易解决。 然后,一个一个地解决每个子问题。从最简单的开始。最简单意味着您知道答案(或更接近答案)。 此后,最简单的方法意味着要解决的子问题不依赖于要解决的其他问题。 解决了每个子问题后,将点连接起来。连接所有“子解决方案”将为您解决原始问题。恭喜你! 该技术是解决问题的基石。记住这一点(如果需要,请再次阅读此步骤)。 4.卡住了吗? # 到现在为止,您可能坐在那里想:“嗨,理查德……太酷了,但是,如果我被卡住甚至不能解决子问题怎么办?” 首先,深呼吸。第二,这很公平。 朋友,请不要担心。这发生在每个人身上!不同之处在于,最好的程序员/问题解决者对bugs/errors的好奇大于对错误的恼怒。 实际上,面对混乱时,可以尝试以下三件事: 调试:逐步解决您的解决方案,尝试找出问题所在。程序员将其称为调试(实际上,这是调试器的全部工作)。 重新评估: 退后一步。从另一个角度看问题。有什么可以抽象为更通用的方法的吗? 研究: 啊,Google不错。您没看错。无论您遇到什么问题,都可能有人解决了。找到那个人/解决方案。实际上,即使您解决了问题,也要这样做!(您可以从其他人的解决方案中学到很多东西)。 警告:不要为大问题寻找解决方案。只寻找子问题的解决方案。为什么?因为除非您奋斗(一点点),否则您将不会学到任何东西。如果您什么都不学,那您就浪费了时间。 实践 # 仅仅一周之后,别指望自己变得很棒。如果您想成为一个好的问题解决者,请解决很多问题! 实践。实践。实践。认识到“使用“在此处插入概念”可以轻松解决此问题”只是时间问题。 怎么练习?wazoo有多种选择! 国际象棋难题,数学问题,数独,围棋,专卖,视频游戏,加密小猫,等等……等等……等等……。 实际上,在成功人士中,常见的习惯是练习“解决微观问题”的习惯。例如,彼得·泰尔(Peter Thiel)下棋,伊隆·马斯克(Elon Musk)玩电子游戏。 例如,我喜欢编码方面的挑战。每天,我都会尝试解决至少一个难题(通常在Coderbyte上)。 就像我说的,所有问题都有相似的模式。 结论 # 那是所有人! 现在,您更好地了解了“像程序员一样思考”的含义。 您还知道解决问题是一种不可思议的技能(超能力)。 如果这还不够,请注意您还知道如何去练习解决问题的技能! ew……挺酷的吧? 最后,祝您遇到许多问题。 您没看错。至少现在您知道如何解决它们了!(此外,您将了解到每种解决方案都可以改进)。 ...

职业发展

October 7, 2019
心得与经验

七个对我最重要的职业建议(阮一峰翻译) # ruanyifeng 一、不要别人点什么就做什么 # “不要做一个别人点了什么才就烧什么的厨师,也不要这样的地方工作,你要去一个地方,那里的人能肯定你对产品的想法,相信你的能力,放手让你去做。” 单单实现一个产品是不够的,你还必须参与决定怎么实现。好的工程师并不仅仅服从命令,而且还会给出反馈,帮助产品的拥有者改进它。 🤔从技术角度改进产品?或者技术角度的feature吗?比如实现更好的交互,新的技术可以做更好的事情? 🤔不能只是让别人给你一个技术方案你只负责实现它,而是要自己能设计一个方案,甚至可以根据自己的技术给出一个让不同feature变成高级的feature。比如更节省成本,时间少人力少、效率高机器成本低、交互好、更美观、用户体验更好等等。总之就是,因为你的一些想法,原来那个别人提出来的东西别的更好了。 🤔对自己有什么好处呢?输出一些想法,肯定是要付出精力的,那么这些精力能不能有所回报呢?首先,它能体现分析、解决问题的能力,体现积极、负责,其次,进一步端粒自己分析、解决问题的能力,锻炼表达能力,这些经验多了起来,就相对其他人来说是一种优势,能创造出一些价值,可以写在简历中,对某某功能提出哪些想法,使成本降低了多少,收益增加了多少。 二、推销自己 # “为了让其他人相信你,你必须首先让别人知道你做了什么。你需要推销自己,引起别人的注意。” 公司的其他人需要明白你的价值,最好的办法就是告诉别人你做了什么。 🤔写邮件告诉别人真的好吗?可能还是写博客好一点吧,但是博客很难找到读者,可以通过掘金、csdn之类的引流一下。 三、学会带领团队 # "当你的技术能力过关以后,就要考验你与他人相处的能力了。" 如何带领一个团队,有效地与其他人协同工作,取到更大的成果。 🤔先看一下左耳朵的文章学习一下沟通技术。 🤔目前我只需要考虑一二三这几个问题。 四、生活才是最重要的 # 五、自己找到道路 # "以前都是我们告诉你做什么,从现在开始,你必须自己回答这个问题了,我期待你来告诉我,什么事情需要做。" 很多工程师都没有完成这个转变,如果能够做到,可能就说明你成熟了,学会了取舍。你不可能把时间花在所有事情上面,必须找到一个重点。 六、把自己当成主人 # "不要再去开这样的会了。你参加一个会,那是因为你参与了某件事。如果不确定自己为什么要在场,就停下来问。如果这件事不需要你,就离开。不要从头到尾都静静地参加一个会,要把自己当成负责人,大家会相信你的。" 从那时起,我从没有一声不发地参加会议。我确保只参加那些需要我参加的会议。 七、找到水平更高的人 # "找到那些比你水平更高、更聪明的人,尽量和他们在一起,吃饭或者喝咖啡,向他们讨教,了解他们拥有的知识。你的职业,甚至你的生活,都会因此变得更好。" 面试时,如何向公司提问? # ruanyifeng 有一些注意点,你需要知道: 面试之前,一定要做准备,多了解公司的情况。 你提出的问题,应该围绕"这份工作是否合适我"这个中心点,其他与应聘关系不大的问题,不宜多问。 提问的时候,要自然放松,不要害羞,就把它当作普通的聊天。你要表现出对公司的真诚兴趣。 提问要直接了当,不要绕圈子。提出问题之后,你要保持安静,让面试官多说话。 面试官回答的时候,你可以做笔记,或者事先询问能不能做。笔记必须简短,你的大部分时间,要用来全神贯注倾听面试官的回答,并与其有眼神的交流。 面试结束后一周内,最好打一个电话或发一封邮件,了解公司对你的反馈意见。即使面试失败,你不妨也问一下原因,这会有助于你以后的面试。 6个问题 为什么招人,之前的人离职了还是公司增长扩张。 为什么大家想留在你们公司。公司的文化、价值观、环境对员工的影响。 如果被录用了,在上班的头两三个月,公司希望我做到的三件事是什么? 一个人像成功地做好这份工作,需要哪些东西? 我刚才说过的话里,是否有哪些内容让你华裔我不适合这份工作。 你们什么时候会做最后的决定? 围绕“这份工作是否合适我”提问 下面是一些你可以问的典型问题。 问题一:你们为什么要招聘这个职位? 这个问题会使得面试官开始谈论当前的项目,或者谈论前一位离职人员。无论哪种情况,都会让你了解,一些与你最密切相关的公司情况。 问题二:你们的新员工多吗? 这个问题起一个过渡作用,使得谈话导向公司内部的情况。但是,它本身也能说明一些问题。如果公司成立已经超过四年,又没有新项目,但是新员工却很多,这往往说明公司文化不是很健康。 问题三:你们公司(团队)目前面临的最大挑战是什么? 如果面试官开始谈论一些具体的技术问题,这很好;如果他的回答是项目时间紧迫,或者需要更多的资金,那你就要小心一点了,公司管理上面可能有问题。 问题四:什么新技术(编程语言)是你们未来希望采用的? 如果你申请的是技术职位,面试官恰巧又是技术负责人,那么这个问题将会非常合适。你会对公司的技术路线有所了解和准备,一旦入职,就能更好地适应公司的需要。 问题五:在业务方面,有没有什么地方是你们不满意的,未来想要改进的? 很少有公司,会百分之百满意自身的现状,即使那些状况很良好的公司也是如此。这个问题可以让你对公司管理层的关注重点和担忧之处,有所了解。 问题六:我申请的这个职位,对公司的业务有何影响? 这个问题会让你了解自己在公司的角色,以及你的岗位对公司是否重要。 如何提高求职时的谈判能力? # (1)记住你不是在求职,不是在展示编程技巧,而是在推销某种商业问题(增加收入或降低成本)的解决方案。 (2)面试时,要有自信,要平等的对话。你要的是一个互利的录用合同,不要每次对方提出要求,你都说Yes。 ...

web前端对密码加密的意义

July 6, 2019
心得与经验

web前端对密码加密的意义 # 有的运维或者后台会记录包含请求体的 access log,如果不加密,log 里面就是明文密码。这种在架构上垂直扩展&多层的公司很容易发生。GitHub 就翻车过一次,在请求日志里发现了明文密码,然后就群发邮件通知用户改密码。 @lincanbin 用单向函数“加密”等同于明文 @hanru 能增加攻击的难度。安全领域并不是非黑即白的,如果小量成本能挡住小学 3 年级的傻子攻击,那就有意义 @otakustay 任何提高攻击门槛的做法都是有意义的 @newmlp 感觉一般加密意义不大,中间人重放就可以了,但聊胜于无。顺便一说 B 站采用的是前端非对称加密 @lzvezr 非对称加密。用公钥加密,知道 JS 源码也没用。但是我觉得在 HTTPS 下面没必要。另外,如果进日志,肯定不要存密码啊。如果原封进日志,那所有加密都没有意义。因为这个加密过的密码本来就可以从前端登录进去。我只是不知道明文而已。CDN 商是可以拦截保存,所以不要啥的都经过 CDN。基于上面的分析,还有一种比较稳妥的方式是前端密码提交的时候,附上 timestamp,用 RSA 公钥加密,服务器私钥解密后验证时间,然后登录一次 timestamp 作废。这样日志泄露或者被拦截,也无法用原密文重放 @lhx2008 看了下苹果、微软、谷歌、fb 这几个登录页面都是明文传输密码的,百度、淘宝、qq 都是先前端加密,总结一下就是在国外没意义,国内有意义 @iiji86 用户密码安全性设计 # 即使被拖库,也可以保证密码不泄露 # 前端rsa私钥加密 # Web前端密码加密是否有意义? - w2014的回答 # 事实上现代密码学已经可以做到很多让人难以想象的事情了下面是一些有一点“反常识”的结论 1.A可以向B证明自己拥有一个密码,但是如果B是假冒的验证者,A不会透露关于密码的任何信息给B。——“零知识证明” 2.A可以和B比较自己持有的一个值的大小关系,而不泄露这个值给对方。——“百万富翁问题” 3.A可以给B发来的一段信息进行电子签名,而不知道信息的内容。——“盲签名” 4.A和B可以,在没有公正第三人的情况下,进行等概率胜负的博弈。——“电子博弈” 5.邮件服务,如果不考虑法律风险的话,是可以做到让服务器看不到你的邮件内容的。——PGP 6.破解4096位RSA是困难的。——即使用超算也如此。破解256位AES是困难的。——即使用量子计算也如此。破解OTP系统是困难(划掉)不可能的。——即使天顶星人来了也如此。 7.一个好的加密算法真的应该是公开的——它可以接受更多人的检验。 一个好的密码系统不一定是公开的——但是它应该按照可以公开除了密码之外的一切而依旧安全来设计。 8.可以实现这样的算法,使得班干部中的任何一个均可以以班委会的名义下达通知,且其他人,除了班长之外,都不知道具体下达者。 9.密码系统的安全性取决于最弱的一环……当年是谁说的“只用https保护登录界面就够了”的来着…你的token也会被盗 10.大多数密码系统都不是被正面攻破的…而是实现过程中出了差错… 11.以上内容,真的,真的,在大多数的密码学教材上都能找到——甚至还有用到的一些算法安全性的数学证明…

如何拥有技术领导力?

May 6, 2019
心得与经验

左耳听风专栏 第一,吃透基础技术,基础技术是各种上层技术的共同的基础。 # 计算机技术太多,但仔细分析你会发现,知识表现形式多,而基础技术并不多。学好基础技术,能让你一通百通,更快地使用各种新技术,从而可以更轻松地与时代同步。 基础技术主要是两部分:编程和系统。 编程部分: # **C语言:**更接近底层,能更好地理解程序的运行。 **编程范式:**培养抽象思维,提高编程效率,提高程序的结构合理性、可读性和可维护性,降低冗余度。学习编程范式:多了解各种程序设计语言的功能特性。 **算法和数据结构:**任何有技术含量的软件中一定有高级的算法和数据结构。比如epoll中使用红黑树,数据库索引使用B+树。业务中的各种排序、过滤、查找也用到算法。 系统部分: # 网络基础:《TCP/IP详解》,学习基础的网络协议,可以为我们的高纬度分布式架构中的一些技术问题提供很多的技术方案。比如TCP的滑动窗口限流,完全可以用于分布式服务中的限流方案。 **数据库原理:**文件系统适合存放连续的信息,比如图片,文章。如果保存很短的信息也保存文件的画,会浪费大量的磁盘空间,而且无法方便地查询。数据库更适合存放短的数据。且能方便的查询。流行的两类数据库管理系统:SQL和NoSQL。前者B+数,强一致性,后者弱一致性,高存取效率,基于哈希表和其他技术。 学习数据库原理,能了解数据库访问性调优的要点。以及保证并发情况下的数据操作的原子性。 **分布式技术架构:**数据库和应用程序服务器需要横向扩展,才能提供做够高的性能。为了做到这一点,要学习分布式技术架构,包括负载均衡、DNS解析、多子域名、无状态应用层、缓存层、数据库分片、容错和恢复机制、Paxos、Map/Reduce操作、分布式SQL数据库一致性等知识点。 学习分布式技术架构的有效途径是参与到分布式项目的开发中去,并阅读相关论文。 第二,提高学习能力。就是能够很快地学习新技术,又能在关键技术上深入的能力。 # 只有掌握了上述基础原理之上,才能拥有好的学习能力。 第三,坚持做正确的事。 # 做正确的事,比用正确的方法做事更重要。因为这样才始终会向目的地靠拢。

如何处理大量bug

December 21, 2018
心得与经验

处理bug分三步:确认位置及原因,解决方案,实现代码。 bug数量很多时,领导的心里会有压力,所以先解决容易改的,让数量降下来,领导的压力小了就可以不加班了。如果你改的数量多还可能认为你比别人有些。 处理问题的“1-2-3”升级策略 # 遇到问题的时候, 自己一个人处理1小时内没有思路,请找他人小范围讨论 如果与他人2小时内没有结果,请上升到团队范围 如果在团队范围3小时内没有思路 我们就需要借助外部力量了。比如:找产品改需求,找公司外的技术高手做咨询,外包