原文做者:Dan Abramov前端
译者:UC 国际研发 Jothynode
写在最前:欢迎你来到“UC国际技术”公众号,咱们将为你们提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。react
编者按:今天这篇文章是 React 团队成员、Redux 做者 Dan Abramov 新编写的一篇文章,这篇文章很是不错。在 2019 到来之际,谨以此文祝你们元旦快乐!算法
你们总觉得我懂得许多东西,而实际状况并非这样的。我不是在抱怨什么,这也不是什么坏事。 (尽管少数派有来之不易的证据,但他们老是受到偏见,这就比较恶心了。)shell
在这篇文章中,我将列出一份你们常常误觉得我很了解的编程主题列表。 并非说你没必要学习它们 - 或者我不了解其余有用的东西。 但因为我如今的立场并不弱,因此我能够说实话。数据库
如下是我认为这很重要的缘由。编程
首先,有个不现实的指望认为,经验丰富的工程师就该了解所在领域的每一项技术。你应该见过囊括了 100 个库和工具的“学习路线图”吧?它颇有用 - 但使人望而却步。canvas
更有甚者,不管你经验多丰富,你的情绪仍是可能会在感受良好、信心不足(“冒名顶替综合症(Impostor syndrome)”)和过分自信(“Dunning-Kruger 效应”)之间切换。这取决于你所处的环境,工做,个性,队友,精神状态,在上面时间等等因素。后端
老练的开发者有时会公开表示他们的不安全感,以鼓励初学者。但其实两者有天壤之别,就像一个经验丰富但仍会紧张的外科医生,和一个第一次拿手术刀的学生!安全
听见别人说“咱们都是初级开发者”挺丧的,就像是对着与你有知识差距的学习者空谈。像我这样善意的从业者并不能用多好的口述解决这个问题。
尽管如此,即便是经验丰富的工程师也存在许多知识缺口。这篇文章写了个人知识缺口,我鼓励那些可以承受相似漏洞的人分享他们的。但分享的时候,记住不要低估咱们的价值。
咱们能够大方认可咱们的知识缺口,但也要记得咱们仍然拥有宝贵的专业知识,须要多年努力积累。
先说好免责声明,如下是我不知道的一些东西:
- Unix 命令 和Bash。我记得 ls 和 cd,但其余命令我也得查了才会用。我理解管道(pipe)的概念,但我只在简单的场景下使用它。我不知道如何使用xargs 建立复杂的链(chain),如何组合并重定向不一样的输出流。我也历来没有系统地学习过 Bash,因此我只能编写很是简单(一般是错误的)shell 脚本。
- 低级语言。我知道 Assembly 能将内容存储在内存中并跳转执行代码,但我了解的仅此而已。我写过几行 C,明白指针是什么,但我不知道如何使用 malloc 或其余手动内存管理技术。历来没玩过 Rust。
- 网络堆栈。我知道计算机有 IP 地址,DNS 是咱们解析主机名的方式。我知道有像 TCP/IP 这样的低级协议来交换数据包(可能?)以确保完整性。我就知道这么多 - 而且对细节认识比较模糊。
- 容器。我不知道如何使用 Docker 或 Kubernetes。 (它们有关系吗?)我对它们一个模糊的认知,知道它们能让我以可预测的方式启动一个单独的 VM。听起来很酷,但我还没试过。
- Serverless。听起来也很酷,但没试过。我不是很明白该模型如何改变了后端编程(也许它并无)。
- 微服务。若是我理解没错的话,它只是意味着“许多 API endpoint 相互通讯”。我不知道这种方法的实际优缺点是什么,由于我没用过。
- Python。我不是很喜欢它- 我已经用 Python 工做了好多年,并且我历来没有费心力去学它。它的导入行为等不少东西对我来讲是彻底的黑盒。
- Node 后端。我知道如何运行 Node,使用像 fs 这样的 API 来构建工具,而且能使用 Express。但我历来没有用 Node 链接过数据库,也不知道如何用它编写后端。我也不熟悉像 Next 这样能实现“hello world”的 React 框架。
- Native平台。我曾尝试学过 Objective C 可是没有成功。我也没有学过 Swift,Java 也是如此。(虽然我能够学习Java,由于我会C#,可是我并无学Java。)
- 算法。我会的最多就只有冒泡排序以及快排了。若是它们与特定的实际问题联系在一块儿,我能进行简单的图形遍历。我理解 O(n) 符号,但个人理解并不比“不要在循环中嵌套循环”深入多少。
- 函数式语言。除非算上 JavaScript,不然我不会流畅的使用任何传统函数式语言。 (我只精通 C# 和 JavaScript - C# 的知识我差很少都忘了)。阅读 LISP 风格(如 Clojure),Haskell 风格(如 Elm)或 ML 风格(如 OCaml)的代码也让我以为吃力。
- 函数术语。就我而言,Map 和 reduce 是最重要的。我不了解 monoids,functors 等。我知道 monad 是什么(但也许是个人幻觉吧🤣)。
- 现代 CSS。我不了解 Flexbox 或 Grid。Floats 才是个人菜。
- CSS 方法论。我用过 BEM(意思是 CSS 部分,而不是原始的 BEM),但我就知道这么多了。我没有尝试过 OOCSS 或其余方法。
- SCSS/Sass。历来没有学过。
- CORS。我超怕这些错误!我知道得设置一些首部字段(header)来修复它们,但过去我浪费了几个小时作这事情。
- HTTPS/SSL。从未设置过。不知道它如何使用私钥和公钥工做。
- GraphQL。我会使用 query,但我真的不知道如何使用 node 和 edge 等表达,什么时候使用 fragment,以及分页的原理。
- Sockets。个人心智模型是他们实现了计算机在请求/响应模型(request/response model)以外互联,但我就知道这么多。
- Streams。除了 Rx Observables 以外,我尚未密切关注过 stream。我使用一两次旧的 node 流,但老是搞乱错误处理。
- Electron。没试过。
- TypeScript。我理解类型的概念,能够阅读注释,但历来没有写过它。我试过几回,遇到了困难。
- 部署和开发。我能够经过 FTP 发送文件或杀死进程,但个人 devops 技能仅限于此。
- 图形。不管是 canvas,SVG,WebGL 仍是低级图形,我都没有高效使用过。我了解总体想法,但须要学习原语。
固然,这份清单并不是详尽无遗。 我还有不少事情都不知道。
讨论可能看起来很奇怪,甚至这篇文章都写得有问题。 我吹嘘本身的无知吗?个人意图是:
- 即便是你最喜欢的开发者也可能不知道不少你知道的东西。
- 不管你的知识水平如何,不一样时期你的信心都会有很大差别。
- 尽管存在知识缺口,但经验丰富的开发者术业有专攻。
我知道个人知识缺口(至少是一部分)。 若是我对某个技术感到好奇,或者项目须要用到,我以后能够学习它。
这不会使个人知识和经验贬值。 我能够作不少事情。 例如,在须要的时候再去学它。
英文原文
好文推荐:
Why review code?
“UC国际技术”致力于与你共享高质量的技术文章
欢迎关注咱们的公众号、将文章分享给你的好友