20日目 シリコンバレー戦略 編「How to become good enough a programmer to work at a top-notch Silicon Valley company? What kind of things do you need to know as a minimum? Any other advice on getting there」 2017年圧倒的成長振り返り一人アドベントカレンダー


この記事は ” 2017年圧倒的成長振り返り一人アドベントカレンダー ” の 20日目です。

https://adventar.org/calendars/2747

アドベントカレンダーに乗り遅れ、参加できそうなものがなかったので行われる、孤独な一人アドベントカレンダー。20日目の今日は、シリコンバレー 戦略 編です。

何はともあれ Google に聞いてみた

シリコンバレーで働くにはどうしたらいいか、Google で検索すると次の記事がみつかった。

https://www.quora.com/How-do-you-become-good-enough-a-programmer-to-work-at-a-top-notch-Silicon-Valley-company-What-kind-of-things-do-you-need-to-know-as-a-minimum-Any-other-advice-on-getting-there

「一流シリコンバレーの会社でプログラマーとして働けるくらい、いいプログラマーになるにはどうしたらいいのか。最低限どんなことを知っていればいいのか。それに関するそのほかのアドバイス。」

最適。ということでさしあたって翻訳。

まとめ

大きく分けて三つのスキルが必要

  1. 課題を技術的にどう解決するかを道筋を立てる Conceptualization
  2. コードを書いて実装する Implementation
  3. 最小限のリソースで素早く動くようにする Optimization

どのようにして

  1. 仕事を通じて獲得する
  2. 期限内に、漠然とした課題を解決する実装をし、
  3. さらに改善する

結局のところ

  1. 特定の技術の知識を問うているわけではなく、
  2. コンピュータサイエンス全体の理解を元に、
  3. 新しい問題を解決するために学習し、
  4. 自分の能力を高めることができるのか
  5. そしてどうやって問題にアプローチするのか。

ということ。

How to become good enough a programmer to work at a top-notch Silicon Valley company? What kind of things do you need to know as a minimum? Any other advice on getting there

There are two questions embedded here:

これには、本質的に二つの問いが内在している。

  1. How do I become a good enough programmer to be hirable anywhere
  2. What does it take to be hired at a top-notch Silicon Valley company
  1. どうすれば、どこでも雇われるほどの良いプログラマーになれるのか
  2. シリコンバレーの一流企業に採用されるためには何をすればいいか

And there is an assumption that being a top-notch programmer is a sufficient pre-requisite to be hired …

この前提として、一流のプログラマーになることができれば、雇われるのに必要な前提条件を満たすことができる、ということがある。

Let’s tackle question (1): Becoming a great programmer.

まずは一つ目の問いから取り組んでみよう。偉大なプログラマーになる。

Programming has three distinct elements. There is conceptualization of an idea, there is implementation of an idea and there is optimization of the implementation.

プログラミングには、三つの独立した要素がある。まず idea を概念化すること。そして idea の実装。最後に実装の最適化。この三つだ。

Conceptualization is the art of being able to translate some fuzzy goal and turn it into something that can be describe in terms of discrete technology blocks. Some people call this architecture, some people call this design, some people call it coding, and what you call it is less relevant than being able to go from “I wish I could do X in the real world” and imagining a way of doing it using technology.

概念化とは、漠然とした目的を解釈して、個別の技術的な課題に切り分ける技術だ。これをアーキテクチャーと呼ぶ人もいるし、デザインと呼ぶ人もいるし、コーディングと呼ぶ人もいる。どちらにせよ「X ができればいいなあ」という希望から始めて、これをテクノロジーを使って実現させる方法を模索することが、概念化だ。

For example, someone at Uber conceptualized the system that made it possible for folks to request a limo anywhere by leveraging mobile fones and cloud infrastructures.

例えば Uber のメンバーは人々がリムジンをどこへでも携帯電話とクラウド上のインフラを使って呼び出すことを可能にした。Uber はこのシステムを概念化したといえる。

Implementation is the art of taking a conceptualized idea and turning it into bits and bytes that run on code. This is a profoundly useful skill and highly portable. What’s important to realize is that there is the specifics of programming languages – how to write code in C++ and the meta-issues of programming – how should I structure my code for efficiency portability and scale of feature development and performance. This requires a deep understanding of computer science fundamentals and real technology and experience with large software systems and large teams and small teams and being able to make the right levels of tradeoffs.

実装は、概念化された idea を、コードとして動く bit や byte 、つまり文字列に変換する技術だ。これは深淵で価値ある技術であり、非常に可搬性が高い。認識しておくべく重要なこととして、各言語には特徴があるのだ、ということがある。C++ でコードを書く方法をわかった上で、さらにメタレベルのプログラミング言語について理解が必要だ。どのようにコードを構造化して、可搬性が高く、そしてスケールさせることが可能な状態をつくりだし、機能開発とパフォーマンスの改善をしていくのか。そのためにはコンピュータサイエンスの根源に関して、かなり深い理解が必要だし、実際の技術に関しても深く理解している必要があるし、大規模開発と小規模開発の両方の深い経験が必要だ。また最適な手法を決められるようになる必要もある。

The key aspect of implementation is the ability to make a compromise between date and quality and design and come up with a brilliant solution instead of a shitty compromise. Most engineers given enough time can come up with a brilliant solution, but when you constrain them they come up with shitty compromises.

実装における重要な側面は、妥協点を見つける能力だ。締め切りと品質とデザインの間で、輝く解決策を見つける。くだらない妥協策ではなく。十分な時間を与えられればエンジニアは誰だって最高の解決策を見つけることができる。しかし制限を与えると、くだらない妥協しか思いつくことしかできない。その中で最高の解決策となる妥協点を見つけなくてはいけない。

Optimization of the implementation is a different skill set, and it’s about understanding why something takes up as much time and resources and being able to preserve correctness while reducing time or resources or both.

実装の最適化は、これもまた今までの技術とは異なった技術で、あるプロセスになぜ時間がかかり、そしてリソースを消費するのかを理解し、時間もしくはリソース、もしくはその両方を減らしながら正常な動作をさせる技術だ。

When a top-notch silicon valley company is looking to hire someone they are looking for someone who has skills in all of these areas.

一流のシリコンバレーの企業は、これら全ての領域のスキルを持った人物を探している。

They are looking for someone who can translate fuzzy ideas into technology bits and pieces that can be implemented. They are looking for someone who can translate the implementations bit into things that ship on time and are desirable in the market. They are looking for someone who can make things go faster.

彼らが探しているのは、漠然としたアイデアをコードで実装できる人物だ。そしてその実装を時間内におこない、市場で価値があるものにできる人物だ。探しているのは、物事をさらに早く進めてくれる人物だ。

If that’s the skill set, how do you go about acquiring that skill set?

さてこういった技術が必要だとした場合、どうやってこれらを身につければいいのだろう?

First of all, the very short answer is to start working on those problems and demonstrating how you can solve each one of them.

まずは、簡潔に言えば、こういった問題に取り組むことを始めることだ。そしてこれらの問題をどう自分が解決するかを示すことだ。

If you have a job, and want a better one, take on projects that are fuzzy and figure out how to turn them into real things that can be implemented, demonstrate how you can implement things better, with higher quality and on time. Take on optimization projects and improve performance and maintain quality.

職業プログラマーで、さらに向上したいと考えているのであれば、早速プロジェクトに取り組んで、漠然とした問題を理解して実装し、さらにそれをどのように改善するか、しかも高いクオリティを持った上で時間内に終わらせるか。それを実務を通して示そう。さらにプロジェクトを最適化し、パフォーマンスを改善し、クオリティを保つ必要もある。

If you’re in school, then find problems you find interesting and try and solve them. Deliver your coursework on time with high quality. Deliver your projects in the same way. Look for ways to make code go faster that is meaningful. Engage with the broader technology community on the internet. Do it with respect and politeness.

もしまだ学生なのであれば、自分が関心のある問題を見つけて、それを解決しよう。課題を締め切り内に、しかも質の高いものを提出しよう。自分のプロジェクトでも同様に進めよう。コードが迅速に動くようにする方法を探すのも価値がある。インターネット上の幅広い技術コミニュティに関わろう。尊敬と礼節をもって。

If you don’t know how to code, and you’re trying to start a new career, then go to school. And if you can’t then you can still start, but it will be harder.

コードを書く方法を知らず、新しいキャリアとしてエンジニアを始めたいのであれば、学校に行こう。もしそれができないのであれば、それでも学習を始めよう。ただしそれは学校に行くよりは難しくはある。

At the end of the day, any company that is great is going to ask you questions that are going to probe those areas, and learn what you learned and understand how you thought about the problems.

結局のところ、企業が問うているのは、彼らのもっている課題を解けるのかということだ。何を学んできてかを確認し、課題についてどのような考え方をするのかを理解したいのだ。

But a really great company isn’t really interested in what you learned, and what your actual skills are, what they are really interested in is how you learned and how you grew and how you approached problems.

ただ、彼らは、あなたが何を学んできたかには興味がない。それから実際の今のスキルがどうかでもない。興味があるのは、どのようにして学習をするのか、そして自分を成長させるのか。そして課題にどうアプローチするのか、ということなのだ。

Great companies understand that they need to hire people who can adapt, can learn and understand the principles of programming as I outlined them.

彼らが探しているのは、状況に適応し、プログラミングの原則を学習し理解できる人間なのだ。これは今まで私が書き出してきた通りだ。

Yes there is a minimum bar of skill, but any school should get you there.

最低限必要な技術のレベルというのはあるが、そこまで学校は引き上げてくれることはない。

And sometimes you can’t get the job because you need specific skills for that job because they can’t afford the ramp up time, and getting those skills is about you finding projects that map to those skills.

仕事に必要なスキルをもっていなくて、企業がそのスキルを勉強させてあげる時間がない場合もある。それが理由で採用されないこともあるだろう。そういう場合には、スキルを身につければ、そのスキルが必要なプロジェクトにはつくことができる。

And if a company seems overly pre-occupied with your specific skills, then there is a danger that the company isn’t approaching hiring in the right way and it may not be the greatest place to work anymore.

もし企業があなたの持っている特定の技術に以上に関心を示しているとしたら、その企業は適切な方法で人選をしていないという危険性があるし、そうだとすれば働く場所としてはよくない場合もある。

まとめ

大きく分けて三つのスキルが必要

  1. 課題を技術的にどう解決するかを道筋を立てる Conceptualization
  2. コードを書いて実装する Implementation
  3. 最小限のリソースで素早く動くようにする Optimization

どのようにして

  1. 仕事を通じて獲得する
  2. 期限内に、漠然とした課題を解決する実装をし、
  3. さらに改善する

結局のところ

  1. 特定の技術の知識を問うているわけではなく、
  2. コンピュータサイエンス全体の理解を元に、
  3. 新しい問題を解決するために学習し、
  4. 自分の能力を高めることができるのか
  5. そしてどうやって問題にアプローチするのか。

ということ。

Leave a Reply

Your email address will not be published. Required fields are marked *