Снимите слои, чтобы стать отличным проявителем

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

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

Не поймите меня неправильно. Я не говорю вам, что вы должны писать сборку, создавать компилятор или создавать собственную ОС с нуля.

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

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

Почему вам следует заботиться

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

В каком-то смысле вы правы. Вы можете написать программу, работающую на JavaScript или Python, без необходимости разбираться в реализациях и слоях, на которых вы строите.

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

Это верно именно потому, что люди, которые работали до вас, были так хороши в своей работе и так хорошо оттачивали свою работу.

Но вот что интересно: понимание основ - ключ к быстрому обучению и долголетию в вашей карьере инженера-программиста.

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

Волшебный вопрос: что, если я пойду на один уровень глубже?

Возьмем современный интерпретируемый язык программирования, такой как Python. Спросите 10 разработчиков Python, как Python на самом деле выполняет ваш код, и вы, вероятно, получите 10 разных ответов. Большинство из них неправильные или неполные.

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

Если вы работаете разработчиком программного обеспечения и не пишете байт-код на перфокартах, то вам следует поблагодарить абстракцию (и работу десятилетий других программистов).

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

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

Спроси себя:

Я понимаю, что происходит на один слой глубже?

Краткие и избранные примеры абстракции в компьютерных науках

Байт в сборку

ОЧЕНЬ сложно писать двоичные или байтовые инструкции для компьютеров, но поначалу это делалось именно так. Самые ранние компьютерные программы (после тех, которые были зашитыми) были буквально листами бумаги с пробитыми в них дырками.

Первые компьютерные ученые осознали, что это ужасно неэффективно и разочаровывает. Они разработали язык ассемблера для общения со своими машинами вместо перфокарт:

****************************************************************************
;
; AddNumbers
; add number 2 at ds:si to number 1 at es:di of width cx
; 
;
; INPUT:     es:di ==> number1, ds:si ==> number2, cx= max width
; OUTPUT:    CF set on overflow
; DESTROYED: ax, si, di
;
;****************************************************************************
AddNumbers:
 std   ; go from LSB to MSB
 clc   ;
 pushf   ; save carry flag
.top
 mov ax,0f0fh ; convert from ASCII BCD to BCD
 and   al,[si]  ; get next digit of number2 in al
 and ah,[di]  ; get next digit of number1 in ah
 popf   ; recall carry flag
 adc al,ah  ; add these digits
 aaa   ; convert to BCD
 pushf   ;
 add al,'0'  ; convert back to ASCII BCD digit
 stosb   ; save it and increment both counters
 dec si  ;
 loop .top  ; keep going until we've got them all
 popf   ; recall carry flag
 ret   ;

Сборка в скомпилированный

Это было намного лучше, чем перфокарты! Но может ли абстракция помочь нам в дальнейшем?

Что, если мы создадим язык с улучшенным синтаксисом, а затем разместим его поверх ассемблера? Тогда нам не пришлось бы использовать сложный синтаксис сборки, и мы могли бы добавить защитные ограждения и проверку типов для помощи при разработке.

Если бы мы создали компилятор для нашего нового синтаксиса, мы могли бы получить гораздо больше гибкости, сохраняя при этом производительность кода более низкого уровня. Скомпилируйте его один раз, запускайте бесконечное количество раз!

#include <stdio.h>
int main() {
    int t1 = 0, t2 = 1, nextTerm = 0, n;
    printf("Enter a positive number: ");
    scanf("%d", &n);
// displays the first two terms which is always 0 and 1
    printf("Fibonacci Series: %d, %d, ", t1, t2);
    nextTerm = t1 + t2;
    while (nextTerm <= n) {
        printf("%d, ", nextTerm);
        t1 = t2;
        t2 = nextTerm;
        nextTerm = t1 + t2;
    }
return 0;
}

Скомпилировано в интерпретируемое

Многие приложения все еще используют скомпилированные языки сегодня, но недавно интерпретируемые языки (и их дальнейший уровень абстракции) находятся на подъеме.

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

Этот новый уровень дает нам еще большую гибкость для быстрого написания программ:

def fibonacci(n):
    if n < 2:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)

Локально для серверов

Людям не потребовалось много времени, чтобы понять, что было бы очень удобно, если бы несколько компьютеров могли совместно использовать доступ к одним и тем же файлам.

Также было бы здорово, если бы существовали стандартные способы передачи файлов между компьютерами.

Итак, мы добавили слой абстракции. Файлы могут существовать на общих дисках, но при этом быть доступными для вашего компьютера.

Это стало возможным благодаря всевозможным технологиям, таким как NFS и FTP. Все построено обычными людьми, такими как вы и я.

Отдельные серверы в Интернет

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

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

TCP / IP, SMTP / POP и многое другое пришли, чтобы помочь файлам перемещаться по подключенному Интернету.

Браузеры помогли динамически отображать документы с гипертекстовой разметкой (HTML) и другие медиафайлы. Интернет, каким мы его знаем, представляет собой одну большую абстракцию битов и байтов на процессорах, оперативной памяти и жестких дисках по всему миру!

В частной собственности в облако

Раньше считалось, что если вам нужен веб-сайт или файловое хранилище, вам нужно было покупать собственное физическое оборудование. Вам придется настраивать жесткие диски и серверы для себя и расширять свое оборудование по мере роста ваших потребностей.

Однако сегодня у большинства компаний нет большой физической ИТ-инфраструктуры (кроме ноутбуков сотрудников и сетей Wi-Fi). Это благодаря другому уровню абстракции: облаку.

AWS, GCP, Azure, Dropbox и другие упростили хранение файлов, размещение приложений и выполнение практически любых операций на своих серверах, чем создание и использование вашей собственной инфраструктуры.

Инфраструктура по запросу - это то, что позволяло таким стартапам, как Uber, Airbnb и Netflix, дешево работать в первые годы своего существования, а затем быстро масштабироваться по мере роста спроса.

Абстракция - это прошлое и будущее компьютерных наук

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

  • Поразительно, сколько работы было вложено в создание языка ассемблера.
  • Который используется в столь же ошеломляющем компиляторе C.
  • Которая используется для запуска сложного динамического языка Python и всех его библиотек.
  • Что используется для создания Flask, полнофункционального веб-сервера.
  • Который поддерживает основные приложения для таких компаний, как Airbnb, Uber и Netflix.
  • Кто размещает свою инфраструктуру на облачных серверах со сложной архитектурой, которые подключаются к глобальному Интернету.

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

Заключительный дубль

Итак, вот мой горячий вывод:

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

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

Что это значит для тебя? Две вещи:

  1. Если вы хотите быть отличным разработчиком, разберитесь с работой, которая была проделана до вас, чтобы знать, как выглядит ценная абстракция.
  2. Чтобы оставаться в курсе и получать доходную работу в качестве разработчика, следуйте тенденции абстракции, куда бы она ни направилась.

О Беннетте

Я веб-разработчик, создающий вещи на Python и JavaScript.

Хотите, чтобы мой лучший контент по веб-разработке и стал лучшим программистом?

Я делюсь своим любимым советом со своим списком рассылки - никакого спама, ничего продажного, только полезный контент.

Присоединяйтесь к 500 другим разработчикам в моей серии писем.