Дэн Абрамов: вещи, которые я не знаю

0
1056
views

Перевод статьи из личного блога Дэна Абрамова «Things I Don’t Know as of 2018».

Дэн Абрамов: вещи, котоыре я не знаю

Люди часто переоценивают мои знания и думают, будто я знаю гораздо больше, чем есть на самом деле. Это не самая большая проблема, так что я не жалуюсь. (Представители различных меньшинств часто страдают от противоположных предубеждений, несмотря на все свои приобретенные тяжелым трудом знания. Вот это действительно плохо).

В этом посте я представлю неполный список тем, относящихся к программированию, с которыми, по мнению окружающих, я хорошо знаком. Я вовсе не хочу сказать, что вам не надо их изучать, или что я не знаю других полезных вещей. Но поскольку сейчас я не нахожусь в уязвимой позиции, я могу быть откровенным относительно того, чего я не знаю.

Я думаю, что это важно, и вот почему.

Для начала, у людей часто возникают нереальные ожидания: они думают, будто опытный разработчик знает каждую технологию в своей области. Вы видали «дорожные карты» со списками сотен библиотек и инструментов? Это, конечно, полезно, но это пугает.

Более того, не важно, насколько вы опытны: вы все равно можете обнаружить, что временами испытываете чувство неуверенности в себе («синдром самозванца»), а временами, напротив, быть излишне самоуверенны («эффект Даннинга-Крюгера»). Это зависит от вашего окружения, работы, личности, коллег, душевного состояния, времени суток и так далее.

Опытные разработчики порой рассказывают о своих пробелах в знаниях, чтобы поощрить начинающих. Но между опытным хирургом, которого по-прежнему охватывает трепет перед операцией, и студентом, впервые взявшимся за скальпель, лежит пропасть!

Фразы типа «все мы джуниоры» могут приводить в уныние и казаться пустыми разговорами слушателям, столкнувшимся с настоящими пробелами в знаниях. Признания практиков, пусть даже сделанные с самыми лучшими намерениями, не помогут преодолеть эту пропасть.

И тем не менее, даже опытные инженеры имеют много пробелов в знаниях. Этот пост – о моих, и я призываю всех, кто может позволить себе подобную уязвимость, поделиться собственными. Но, делая это, давайте не принижать нашего опыта.

Мы можем признавать нехватку каких-то знаний, чувствовать или не чувствовать себя самозванцами, и при этом все равно иметь очень ценный опыт, для приобретения которого понадобились годы тяжелого труда.

Темы, неизвестные Абрамову

Итак, вот вещи, которые я не знаю:

  • Команды Unix и Bash. Я могу воспользоваться ls и cd, понимаю концепцию конвейеров, но использую все это только в простых случаях. Я не умею использовать xargs для создания сложных цепочек, не знаю, как сцепить и перенаправить различные потоки вывода. Также я никогда серьезно не учил Bash и могу писать только очень простые shell-скрипты (и часто с багами).
  • Низкоуровневые языки. Я понимаю, что Assembly позволяет хранить вещи в памяти и прыгать по коду, но на этом всё. Я написал пару строчек на С и понял, что такое поинтер, но я не знаю, как использовать malloc или другие техники ручного управления памятью. Никогда не игрался с Rust.
  • Сети. Я знаю, что у компьютеров есть IP-адреса, а DNS позволяет резолвить имена хостов. Знаю о существовании низкоуровневых протоколов вроде TCP/IP для обмена пакетами, которые (возможно?) обеспечивают целостность. На этом всё – деталей я не знаю.
  • Контейнеры. Представления не имею, как пользоваться Docker или Kubernetes. (Они как-то связаны друг с другом?) У меня есть смутное представление, что они позволяют мне предсказуемым образом запускать отдельную виртуальную машину. Звучит круто, но я не пробовал.
  • Бессерверные технологии. Тоже круто звучит. Никогда это не пробовал. У меня нет четкого представления о том, как эта модель меняет программирование бэкенда (если вообще меняет).
  • Микросервисы. Если я правильно понял, это просто означает «много API endpoints, сообщающихся друг с другом». Я не знаю, каковы практические достоинства и недостатки этого подхода, потому что я с микросервисами не работал.
  • Python. Вот насчет этого обидно, потому что я в определенном смысле работал с Python несколько лет, но так и не удосужился изучить его. Есть много вещей, таких как поведение при импорте, которые для меня тайна за семью печатями.
  • Node бэкенд. Я понимаю, как запускать Node, я пользовался некоторыми APIs, такими как fs, для сборки инструментов, и я могу настроить Express. Но я никогда не обращался из Node к базе данных и не знаю, как, собственно, писать в нем бэкенд. Я также не знаком с фреймворками React, такими как Next, на более глубоком уровне, чем написание «hello world».
  • Нативные платформы. Я пытался изучать Objective C, но это не сработало. Также я не изучал Swift. То же самое касательно Java (я мог бы, вероятно, его осилить, поскольку работал с C#).
  • Алгоритмы. Самое большее, что можно из меня выдавить, это сортировку пузырьком и, возможно, быструю сортировку (в хороший день). Я, вероятно, смог бы выполнить простые задачи поиска по графу, если бы они были связаны с конкретной практической проблемой. Я понимаю О(n) нотацию, но мое понимание не намного глубже, чем «не вставляйте циклы в циклы».
  • Функциональные языки. Если не считать JavaScript, я не владею свободно ни одним из традиционных функциональных языков. (Я вообще свободно владею только C# и JavaScript, да и то C# я почти забыл). Мне сложно читать код на языках, вдохновленных LISP (например, Clojure), Haskell (например, Elm) или ML (например, Ocaml).
  • Функциональная терминология. Map и reduce это самое большее из того что я знаю. Мне не знакомы моноиды, функторы и т. п. Я знаю, что такое монада, но и это, возможно, лишь иллюзия.
  • Современный CSS. Я не знаком с Flexbox или Grid. Мне нравится float.
  • Методологии CSS. Я пользовался БЭМ (в смысле, БЭМ как часть CSS, не настоящий BEM), но это все, что я знаю. Я не испытывал OOCSS или другие методологии.
  • SCSS / Sass. Никогда не приходилось их изучать.
  • CORS. Эти ошибки меня ужасают! Я знаю, что мне нужно настроить какие-то хедеры, чтобы их исправить, но когда-то в прошлом у меня впустую ушли на это целые часы.
  • HTTPS / SSL. Никогда не настраивал. Понятия не имею, как это работает (за исключением идеи приватных и публичных ключей).
  • GraphQL. Я могу прочесть запрос, но не знаю, как выразить что-то с помощью узлов и ребер, когда использовать фрагменты и как там работает пагинация.
  • Сокеты. У меня есть представление, что они позволяют компьютерам говорить друг с другом вне модели запросов/ответов, но это все, что я знаю.
  • Потоки. Помимо Rx Observables, я не работал с потоками достаточно плотно. Раз или два использовал потоки старого Node, но всегда путался с обработкой ошибок.
  • Electron. Никогда не пробовал.
  • TypeScript. Я понимаю концепцию типов и могу читать аннотации, но писать мне не приходилось. Я несколько раз пробовал, но сложности повергали меня в бегство.
  • Деплоймент и devops. Я сумею послать какие-нибудь файлы по FTP или убить какие-то процессы, но это предел моих devops-навыков.
  • Графика. Что бы это ни было – canvas, SVG, WebGL или низкоуровневая графика – я в этом не силен. У меня есть общее представление, но мне нужно изучить основы.

Конечно, этот список далеко не исчерпывающий. Есть много вещей, которых я не знаю.

Список еще не полон

Выводы

Может показаться, что это странная тема для обсуждения. Кажется, что как-то даже неправильно писать такое. Я что же, хвастаюсь своим невежеством?

По моему представлению, читатель этого поста должен прийти к следующим выводам:

  • Даже ваши любимые разработчики могут не знать многих вещей, которые вы знаете.
  • Ваша уверенность в себе может очень варьироваться независимо от вашего уровня знаний.
  • Несмотря на пробелы в знаниях, опытные разработчики обладают ценным опытом.

Я знаю о недостатках в своих знаниях (по крайней мере, о некоторых из них). Позже я могу их восполнить, если заинтересуюсь какой-то из этих тем или если мне это будет нужно для какого-нибудь проекта.

Это никоим образом не обесценивает мои знания и опыт. Есть множество вещей, которые я умею делать хорошо. Например, изучать технологии по мере необходимости.



ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here