Откройте для себя совершенно новый мир программирования с этими невероятными навыками

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

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

Изучите пять разных языков программирования

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

Когда вы пишете на Java, часто возникает соблазн:

  • Представьте проблему с объектом
  • Прикрепите к этому объекту какое-то состояние и функциональность
  • Создавайте классы, которые используют этот объект и работают вместе над решением проблемы.

Эти шаблоны обычно соответствуют тому, как можно написать хорошую Java. Но если вы хотите эффективно решить эту проблему, вам понадобится нечто большее, чем подход Java в вашем арсенале инструментов. Например, если вы изучали Голанг, вы могли бы:

  • Создайте простую структуру с данными
  • Разделите свою функциональность на серию составляемых функций без сохранения состояния.
  • Создайте приложение, которое связывает вместе серию вызовов этих функций.

Та же проблема, разные идеи

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

Я видел, как люди одержимы парадигмами Java, и это приводило к таким чудовищам:

private void doAThing() {
  AbstractFactoryBuilder afb = AbstractFactoryBuilder.instance();
  Factory f = afb.buildFactory(config);
  Object o = f.build();
}

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

Так почему пять?

Должен признать, это немного случайное число. Выучите три, если у вас мало времени, выучите десять, если вам это действительно нравится. Идея в том, чтобы увидеть новые горизонты. Если вы Java-профессионал, выучите немного Clojure или Haskell. Если вы эксперт по Javascript, попробуйте немного Ruby. Получив пять, вы познакомились с множеством различных подходов к решению проблем, и ваш разум прекрасно снабжен навыками осмысления.

Практика письма

Это кажется немного странным, но выслушайте меня. Начнем с простой цитаты Мартина Фаулера о целевой аудитории вашего кода:

«Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям ».

Когда вы пишете код, вы не решаете проблему. Вы описываете компилятору, как решить проблему. Когда вы развертываете код и он правильно работает для предполагаемого пользователя, проблема решается.

И это описание часто отсутствует ...

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

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

И даже вплоть до вроде бы конкретных советов, таких как «Разбивайте текст на абзацы». Слышал это раньше? Вы когда-нибудь видели такую ​​функцию?

private void doAThing() {
  System.out.println("Initial log");
  
  List<String> words = Arrays.asList("hello", "world", "something", "is", "in", "here");
  
  for(String s : words) {
    System.out.println("I am doing something with this word");
    System.out.println(s);
    
    doSomething(s);
    doSomethingElse(s);
    thenDoSomething(s);
    finallyDoThis(s)
  }
  for(String s : words) {
    System.out.println("I am doing something with this word");
    System.out.println(s);
    doSomeOtherStuff(s);
    andSomeMoreStuff(s);
    // This is the last but not the last
    okayLastThingIPromise(s);
    finallyDoThis(s);
  }
}

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

  • Разбейте его на более мелкие абзацы (методы).
  • Убедитесь, что вы понимаете, что пытаетесь сказать (т.е. напишите решение элегантно).
  • Не повторяйтесь (например, почему два цикла проходят через одни и те же данные?).
  • Четко излагайте свои идеи (например, что означает «последний, но не последний» !?).

Совет Фаулера снова и снова звучит правдоподобно. Я видел очень много инженеров, которые пытались представить свое программное обеспечение, используя запутанный и неуклюжий код, на то, чтобы разобрать его часами. Истинные мастера, сенсеи, пишут просто и эффективно. Как нам развить этот навык?

Средство

Научитесь немного писать. Прочтите некоторые основы, например Элементы стиля: простые, понятные книги, предназначенные для улучшения вашей прозы. Благодаря этому вы узнаете, как более эффективно передавать свои письменные идеи, избегая очевидных ошибок многих инженеров, которые работали до вас.

Тогда начните блог! Блог о технологиях или литературе, праздниках или конфликтах - все, что душе угодно. Практика ведет к совершенству, и вы разовьете острое чувство содержательных, простых описаний, которые полностью и точно отражают ваши блестящие идеи. Имейте в виду, что никому не нужно это читать. Это просто для вас, чтобы опробовать некоторые из этих новых навыков, которые вы приобрели.

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

Не перегружайте слова

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

private void printAThing(String a) {
  System.out.println("I am printing: " + a);
  sendToPrinter(a);
  System.out.println("I am writing in print: " + a.toUpperCase());
}

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

Разработайте глоссарий

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

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

Не будь фанатиком

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

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

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

Тест, Тест, Тест

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

TDD - не всегда ответ

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

Точно так же, если вы сядете с ручкой и бумагой и напишете свое решение, найдите точки для имитации и решите, где находится граница вашей системы, также вы получите блестящий уровень ясности. TDD - не единственная игра в городе, и не верьте никому, кто говорит вам обратное. См. Выше: не будь фанатиком.