Я пишу код и разрабатываю компьютерное программное обеспечение с 18 лет. Теперь я знаю, что некоторые из вас могут сказать: «Это ничего! Я программирую с шести лет!», ну и молодец. Учитывая, что в этом году мне исполнилось 50 лет и моя карьера программиста началась в Нигерии, где компьютеры были очень редким товаром, 18 лет было рано, и я думаю, что у меня все хорошо.

Итак, после 32 лет «Школы программирования» я оглянулся на то, чему научился за эти годы, и решил поделиться некоторыми из них со всеми, кто захочет послушать. Это не мои мемуары, но, вероятно, они ближе всего к тому, что я могу написать. Я начну с этой статьи с моего базового подхода к тому, как работает компьютерное программное обеспечение, а затем мы посмотрим, что из этого получится.

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

Любая программная система — это просто набор слоев, один над другим или обернутый вокруг него.

Насколько это глубоко?

Давайте рассмотрим простой (или кажущийся простым) пример… что происходит, когда вы нажимаете клавишу «A» на клавиатуре в стандартном текстовом поле в приложении с графическим интерфейсом пользователя?

Вот как складываются слои:

Давайте возьмем в качестве примера «Клавиатурный программный уровень» и немного разберем его…

Теперь, если бы я был производителем клавиатур, я, вероятно, мог бы еще больше разбить рис. 3, но вы поняли идею. В этом случае, если бы я был заинтересован в мигании светодиода Caps Lock на клавиатуре каждый раз при нажатии клавиши, я мог бы игнорировать практически все остальные действия компьютера и сосредоточиться на выяснении «Переключить любые светодиоды на клавиатуре, если это необходимо». " слой. С другой стороны, если бы я хотел сделать это только при нажатии клавиши «A», то я, вероятно, хотел бы начать с первого слоя… «Какая клавиша была нажата?»

Если мы возьмем «Уровень обработки ввода операционной системы» (из рис. 2) в качестве другого примера, его можно условно разделить на…

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

Звучит просто

Это действительно так просто на фундаментальном уровне. Сложность заключается в том, чтобы сначала отследить интересующий вас слой или тот, который вам нужно изменить, а затем обнаружить, что он был плохо написан, имеет недокументированные зависимости от десяти или даже пятидесяти других слоев или изначально был написан на каком-то загадочном языке. такие как Assembly (https://en.wikipedia.org/wiki/Assembly_language)! Или, возможно, это жестко связано с каким-то аппаратным компонентом, произведенным компанией, которая больше не работает, или даже с тем, что программное обеспечение настолько устарело, что все первоначальные разработчики либо вышли на пенсию, либо умерли!

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

Чем больше вещи меняются, тем больше они остаются прежними.

В ранние годы программирования, если мне нужен был файл ISAM (метод индексированного последовательного доступа), я сам писал подпрограммы ISAM (в то время на BASICA). Со временем файловые подпрограммы ISAM стали еще одним скрытым (само собой разумеющимся) слоем в большинстве современных систем баз данных.

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

Между прочим, вопрос о том, чтобы поле принимало только числовой ввод, до сих пор является популярным вопросом среди разработчиков. Очевидно, чем больше вещи меняются, тем больше они остаются прежними. Вот несколько вопросов, которые я нашел по этому поводу в Stack Overflow:

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

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

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

Это лишь одна из вещей, которым я научился в «Школе программирования».

- ДУБ