https://github.com/LiuKay/the-way-to-upgrade/blob/master/ARTS/ARTS-2020-05-31.md
1 Algorithm
最近两周刷了一些 Leetcode 上 Array
和 List
相关的基础题
(leetcode 中英文切换可以直接将https://leetcode.com/XXX改为https://leetcode-cn.com/XXX跳到对应题目)
1.1 比较有代表性的题
Array:
-
Container With Most Water
-
3Sum
-
Climbing Stairs
-
Move Zeroes
-
Remove Duplicates from Sorted Array
List:
- Reverse Linked List
- Merge Two Sorted Lists
- Swap Nodes in Pairs
1.2 思路清奇的题解
-
Plus One
-
Reverse Linked List
1.3 刷题总结
正在实践 覃超推荐的“五毒神掌”–五遍刷题法,有时间做题目的时间比较分散,往往会忘记做题的时间,所以应该还是得记录一下每天做了什么题,按照时间线来进行复习。
在这两周的做题中发现一些固定的模式,
- 一是
双指针法
的使用,要理解清楚每个指针的作用是什么,以及何时会改变,还有边界在哪里 - 解题的过程应该是从简单的思路开始,再到慢慢优化出最佳方案,有时间看到一个题目,直觉里有一个比较模糊的解法,但是在实现的过程中就会忘记一些必要的条件和限制,而这样的限制可能是在最直接的解法里面最明显的。
- 左右两边往中间逼近的策略,如 contain water,有点让我想起高数里面的"夹逼准测"
- 升维的思想,比如
双指针
其实是一种 一维上二维的思想 - 空间换时间。时间和空间是算法里面最重要的2个维度,当然在目前来看时间的效率更为优先。
- 在
Discuss
区的最高投票里面总能看到各路大神的精彩解答
2 Review
The Key to Accelerating Your Coding Skills - KEN MAZAIKA
作者的个人主页:https://kenmazaika.com/about/
2.1 起步阶段:
- 学习领域相关知识(
domain-specific knowledge
),比如用 Ruby怎么写循环,用代码从数据库读取特定数据, 这方面的知识往往与具体的编程环境相关 - 要成为一个自学自足开发者的第一步就是能够完成具体的任务。
- 对初学者来说,最重要的技能是能够关注细节,一是能够读懂错误信息,能够
Debug error message
, 知道发生了什么,二是能够从每一个你犯的错误中去学习,当下次再遇到的时候就能够快速的解决 - 善用 Google 进行搜索
你永远不可能知道所有的知识来解决所有的问题,要保持终生学习的态度
当下面这些情形发生的时候,说明你已经度过起步阶段进入下一阶段了:
- 当你遇到很多错误信息时你已经不在像开始时那样害怕,反而能够知道怎么去解决他们
- 当你十分擅长通过搜索引擎来寻找解决方案
- 当你能够从曾经写过的代码中来学习,而不是从头开始一步一步的重新来过
2.2 转折点
这个阶段称为The Inflection Point
, 虽然只是整个学习过程的一部分,但却是最重要的一个阶段,因为在这个阶段你将要面对的是那些没有现成答案的问题。
很多时候你会觉得自己并没有准备好,而且倾向于去做一些基础性的工作,比如一些Get started
工作。这个阶段你甚至会怀疑自己是不是真的适合做一名开发人员。一个很重要的原因是:
During the inflection phase, you will be coding 10-20 times SLOWER than in the previous phase
在这个转折点上,你的编码速度将会比入门时慢10到20倍
尽管在感觉上你会觉得自己进步很慢,甚至自我怀疑,但是实际上,你其实在那些最重要的事情上取得进步。
这里作者引出了相对于domain-specific knowledge
的另一种知识:procedural knowledge
Procedural knowledge is the ability to teach yourself what you don’t know along the way.
简单来说就是在学习过程中如何自学自己不知道的东西的能力。比如你要实现一个新的功能,你该如何开始,如何设计,如何实现?
对于开发者来说,domain-specific knowledge
和precedural knowledge
同样重要。
作者给出了对开发者的中肯建议:
For the rest of your life, go outside your limits every single day
对于很多工程师来说,他们一旦找到自己的舒适区就会裹足不前,他们大多数以维护者的身份出现。而你应该追寻的是那些每天都在寻找突破自己能力限制的人,尝试去解决那些在你技术栈之外的问题,以此来扩展你的技能。
2.3 两个拐点
-
The web development inflection point
你有能力构建任何数据库驱动的系统 ,我们通常来说叫掌握了CRUD
-
The algorithm and data structures inflection point
算法和数据结构,掌握数据结构和算法意味着掌握了某一门编程语言的基本知识,以及操纵数据和能够理解一些性能上的取舍
2.4 关于拐点的结论
When learning to code,domain-specific knowledge doesn’t matter in the grand scheme of things
当学习编码时,domain-specific knowleage
其实并没那么重要,真正重要的是:
- 你对 web 开发框架有一个扎实的理解
- 能够掌握用任何一种你所熟悉的语言写出复杂算法的实现
这里作者用各大厂为什么如此看重算法和数据结构来举例说明,真正重要的东西其实就是这2样。
2.5 在拐点你将学会的
对于开发者来说,最好的参考就是你曾经写过的类似的代码,当你完全理解了你所写的东西,你根本不用去记他们,所以每次开发一个新的功能时请先反问一下自己 :“我是不是写过类似的代码?”如果是,请翻出以前的代码并逐行解释给自己,现在是否能够重用?
2.6 高效通过拐点的策略
During the tutorial phase, take breaks from going over structured material and give yourself challenge problems along the way
- try to do something that is outside the scope of the tutorial - 尽量做一些超出入门教程的尝试
- Try to use tutorials as little as possible - 少使用辅导教程,多参考 GitHub 文档
- Focus on the essentials and use repetition - 刻意练习,重复练习
通过拐点是一件很有挑战性的事,理解这些能够帮助你更好的学习:
- 明白这个阶段本身就是困难和不那么轻松的,
- 明白在这个阶段其实是在跟你自己的信心做斗争,你的感受其实很常见,想想那些比你牛的人
- 持续的努力,但是不要过度透支自己
2.7 如何知道自己已经通过拐点
The final stage of the inflection point process is acceptance. Acceptance that software
development is a process of continuous learning
终于明白编程其实是不断持续的学习,去解决更为复杂的问题。
学习是为了找到方法,而不是问题的答案。
3 Tips
Typora + PicGo + Gitee 完全使用Markdown 写作
Typora
是一个所见即所得的 Markdown 编辑器,支持 Windows, Mac 等,用它来进行 markdwon 写作简直不要太爽。但是众所周知 markdown 写作的一个问题就是图片链接,在本地写作时,插入的链接可以是本地图片的路径,这就导致了在需要发布文章的时候,需要手动将图片上传到图床上去,然后替换为网络地址。所幸的是 Typora
也帮我们解决了这个问题。 Typora
本身不支持上传图片,但是它支持使用第三方的图床工具,比如我们这里要用到的 PicGo
。
PicGo 是一个强大的开源的图床工具,支持各大图床如腾讯云COS, 七牛云等,甚至还能使用 GitHub 作为图床仓库,上传图片自动返回图片链接到Typora
。
在安装好了 PicGo 之后,进入 Typora 的偏好设置->图像->上传服务设定
选定 PicGo 的安装程序即可。
需要注意的是,如果使用 GitHub 作为图床,由于网络原因有时候图片可能出现无法显示的问题,这个时候其实可以替换成以Gitee(码云)
作为图床,需要在 PicGio 安装github
的一个插件,如下图,配置和 github 类似,可以参考 PicGo 的使用文档,这样在国内的环境下图片显示还是很稳定的。
可以参考这篇文章进行 Gitee 作为图床的配置以及 PicGo 的官方文档, 这些地方都有详细的教程,我就不再赘述。
Gitee图床+PicGo+Typora便捷在博客中使用图片
PicGo
4 Share
在我看来作为一名软件开发者,应该是有最基本的职业素养的,而不是说只要功能能跑就行了,这当然是最低的标准,但是如果仅仅只是满足于功能能跑就行,那也只能在日复一日的重复劳动中度过。
工程师也应该站在客户的角度去理解问题,即所谓的business value
,你所做的工作到底能够给用户带来多大的价值,这是公司评判你贡献的标准,如何提高这方面的输出,才是公司愿意给你高薪的理由。