瞎逛论坛发现有意思的帖子
以下是翻译和个人见解,有兴趣的小伙伴自行浏览:https://www.reddit.com/r/rust/comments/ciudhi/evolution_of_rust_in_the_marketplace/
当你看到一则招聘c++需要有一定经验的广告时,然后断定自己没有那么多经验不懂c++,就觉得自己不合适,也许你是对的,但有很大的可能是你误解了这个广告的意思。
可能有一些地方,由于某些原因,一些公司可能正在寻找Y方面的专家,比如:“在X有Y年的经验”。例如C++有5年经验,Spring有2年经验等等。
这很常见,在有些情况下,如果HR不知道自己在做什么,他们甚至会认为这是这是硬性条件,是神圣不可侵犯的,国内很多HR是不懂技术的。
在绝大多数情况下,“X年的Y经验”只是一个粗略的指导方针,就好比老子公司只要985,211的,不可否认你也许来自专科技校,非常优秀,但这样的门槛确实很省时省事。
- X旨在暗示所需的资历;0-1年是针对初学者,2-4年是针对初中生,5-10年是针对普通学生,10+年是针对高年级学生。不同级别的资历也暗示了工作类型(高级可能意味着导师、技术/架构决策……)和工资。
- Y的目标是给出一个领域的提示,例如c++可能意味着:系统编程(内核,驱动程序,嵌入式),高性能计算(数值,科学,机器学习),实时(嵌入式,音频/视频),低延迟,…技术面试官会明白,任何在同一领域有C或Rust经验的人都能相对较快地适应。
“在Y有X年的工作经验”,唯一可以肯定的是,这份工作需要和Y一起工作;如果你不喜欢它,或者不想和它一起工作,你最好放过它。
学习
只要求会X语言开发的工作是无意义的。
我从未见过一份工作只要求我只用一种语言编程。当然,通常有一个主要的语言,但是:
- 我的第一份工作主要是c++,有一些SQL, HTML, CSS, JavaScript和Python/Bash。
- 我的第二份工作主要是c++,有很多SQL,还有一些Python/Bash。
- 我目前的工作主要是c++,有一些x64汇编(调试),Java,和一些Python/Bash。偶尔看看系统Verilog也。
此外,你看到的语言越多,你就越能意识到这些语言有多少共同之处。当你第一次看到一个概念时,你会很纠结,但第四或第五次,它就像几年后回到自行车上一样,它马上就回来了。
(看得出来答主知识面挺广,web,底层,脚本都会)
因此,我的建议是,不要把学习一门语言的重点放在深度上,而应该着眼于广度:
- 计算机科学很棒:数据结构和算法不是你每天都要编写的东西,但理解它们并应用复杂性分析是很棒的。
- 语言有很多不同的编程范式,顺序没有特别的顺序:C/ c++ /Rust, Java/ c#, JavaScript, Haskell, Python/Ruby, Lisp, Forth, Eiffel,…每一组都带来了一些新奇的东西。
- 现实世界!=作业:作业往往很小,定义明确,并且很快就被遗忘了。现实世界中有大量的代码库,这些代码库已经有机地发展了几十年,并且有一些仅在粗粒度级别上定义的高级功能需求(即使这样,通常也有回旋余地)。如果你想要早期体验现实世界,要么在编程商店或现有的开源项目中找到一份兼职工作——坚持存在,因为它意味着已经庞大且负担着技术债务。
(大佬的意思是全都肝一遍)
你可以阅读像《Clean Code》等书籍。但说实话,你只有亲身经历过现实世界的混乱后,才会感激他们的建议。:)
(被猪队友的abc命名坑过)
广泛的学习
此外,以防你误以为编程工作就是编码,远不止这些。
编程还包括:
- 交流:英语。如果你的第一语言不是英语,那这就是你在大学里的首要任务——如果有必要,可以选修额外的课程,开始每天用英语阅读或写作,开始看英语电影。如果你的第一语言是英语(你很幸运),但你又不太擅长它,那么它也是你的首要任务。拼写错误在任何职业邮件中都会让人很尴尬,在对话中摸索单词也很尴尬,而且由于发音含糊而不得不重复一遍,这会让你怀疑自己被误解了多少次。
- 沟通:清晰和简洁。还记得我提到的粗粒度规范吗?猜猜谁来澄清他们?你!当然是指听/说和读/写。它还意味着与技术同行和非技术客户进行沟通。这意味着要重新措辞以确保你能理解。这意味着总结讨论内容,留下可以回头查看的痕迹。
- 规划。至少,要计划好你的工作,知道如何把大任务分成小块,了解业务优先级……
(这很重要,很多程序员包括我也是,不咋说话都是闷葫芦,也许程序员的性格就是这样,冷静沉着,找出你语言中的bug,开个玩笑)
最后
深入学习一门编程语言应该是你最不用担心的事情。
相反地,你应该从广义上学习编程:解决谜题、浏览大型代码库、清晰有效地交流、熟悉各种编程范式和语法以便变得灵活。
哦,如果你想通过贡献开源来尝试一下,我可以推荐Rust社区吗?它很受欢迎,并且有很多关于各种各样主题的令人兴奋的项目;)
这里有一个重要的警告,一些申请可能会被非技术的招聘人员或人力资源人员过滤,或者招聘网站愚蠢的匹配算法不会理解这些,它只是匹配关键字,不会对你的简历做出更深度的匹配。
(所以现在要对招聘网站愚蠢的匹配算法做SEO了吗?/狗头)
(其他评论就不看了,有兴趣的小伙伴自己看下)
原文
There are no language X job advertisements.
I think there is a misunderstanding here; you see an advertisement asking for C++ experience and conclude that not knowing C++ you are unfit. There's a slim possibility that you are right, and a near overwhelming possibility that you misunderstood the ad.
Now, before going further, there are possibly some places where "X years of experience in Y" is a sacrosanct requirement; the company may be looking for an expert in Y for some reasons. And there are cases where HR may even believe it is sacrosanct, if they have no idea what they are doing.
In the vast, overwhelming, majority of cases though, "X years of experience in Y" is really a rough guideline:
-
X aims at giving a hint of the seniority required; 0-1 is aimed at beginners, 2-4 at juniors, 5-10 at regulars and 10+ at seniors. The varying level of seniority is also a hint at the kind of work (senior may imply mentorship, technological/architecture decisions, ...) and compensation.
-
Y aims at giving a hint at the domain, for example C++ could mean: systems programming (kernel, driver, embedded), high-performance computing (numerical, scientific, machine-learning), real-time (embedded, audio/video), low-latency, ... A technical interviewer would understand that anybody with experience in C or Rust in the same domains would be able to adapt relatively quickly.
The only quasi-certainty in "X years of experience in Y" is that the job involves working with Y; if you don't like it, or do not want to work with it, better pass your way.
Learning
X developers are pointless.
I've never seen a job which required me to only ever program with a single language. There's usually a main language, certainly, but:
-
My first job was mainly C++, with some SQL, HTML, CSS, JavaScript, and Python/Bash.
-
My second job was mainly C++, with a lot of SQL, and some Python/Bash.
-
My current job is mainly C++, with some x64 assembly (debugging), Java, and some Python/Bash. The occasional glance at Systems Verilog too.
Furthermore, the more languages you see, the more your realize just how much in common those languages have. The first time you see a concept, you'll struggle with it, but the fourth or fifth time, it's just like getting back on a bicycle after a couple years, it just comes back instantly.
My advice, therefore, is NOT to make the mistake of focusing on learning a single language in depth and instead aim for breadth:
-
Computer Science is awesome: data-structures and algorithms are not something you code daily, but understanding them and applying complexity analysis is great.
-
Languages have a lot of different programming paradigms, in no particular order: C/C++/Rust, Java/C#, JavaScript, Haskell, Python/Ruby, Lisp, Forth, Eiffel, ... Each of these groups bring something novel to the mix.
-
Real world != assignments: assignments tend to be small, well-defined, and immediately forgotten. The real-world has large code-bases which grew organically for decades and have high-level functional requirements that are only defined on a coarse-grained level (and even then, there's often leeway). If you want early experience with the real world, either find a part-time job at a programming shop or an existing open-source project -- insisting on existing, as it means already large and laden with technical debt.
You could read books, like Clean Code, etc... but honestly, you'll only appreciate their advice after experiencing the mess of the real world first-hand ;)
Broader Learning
Also, just in case you are under the misconception that a programming job is about coding; it's a lot more than that.
Programming also involves:
-
Communication: English. If your first language is not English, that's your first priority in University -- take extra courses if needed, start reading/writing in English daily, start watching movies in English. If your first language is English (lucky you), but you're not too good at it, then it's also your first priority. Spelling mistakes are an embarrassment in any professional e-mail, fumbling for words in a conversation is always awkward, and having to repeat because you mumble makes you wonder how many times you were misunderstood.
-
Communication: Clarity & Concision. Remember when I mentioned coarse-grained specifications? Guess who it falls onto to clarify them? YOU! It means listening/speaking and reading/writing, of course. It also means communicating with technical peers and non-technical clients. It means rephrasing to ensure you understood. It means summarizing discussions to leave a trace you can come back to.
-
Planning. At the very least, planning your work, knowing how to divide a large task in small chunks, understanding business priorities, ...
In Parting
Learning a programming language in depth should be the least of your worries.
Instead you should learn programming in the broad sense: puzzle-solving, navigating large code-bases, communicating clearly and efficiently, and getting comfortable with a variety of programming paradigms and syntax so as to be flexible.
Oh, and if you're looking to get your feet wet by contributing to open-source, may I suggest the Rust community? It's welcoming, and there are a lot of exciting projects on a broad variety of topics ;)