Логическое мышление о программном обеспечении

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

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

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

Примечание. Поскольку основная часть работы, которую я выполняю, приходится на JavaScript и React, я часто буду использовать такой синтаксис или примеры, чтобы продемонстрировать точку зрения.

В любом случае, что такое логика?

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

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

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

Законы логики

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

Закон идентичности

Это немного эзотерично, но в двух словах говорит о том, что при заданном значении оно идентично самому себе. Разработчики, использующие функциональное программирование, должны быть знакомы с концепциями идентичности и ее применения, но поиск реальной цели знания того, что «эта собака есть собака» или true === true, кажется глупым. Я укажу, как идентичность вступает в игру, в одном из будущих постов о двусмысленности, а пока просто примите этот закон во внимание.

Закон непротиворечия

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

Это применимо практически ко всему, что вы заявляете. Например:

Человек A: «У Angular больше пользователей, чем у React!»

Человек Б: «Нет, у React больше пользователей, чем у Angular!»

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

Закон исключенного среднего

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

Используя другой пример кода, давайте посмотрим:

Давайте снова посмотрим на разговор о том, у какого пакета больше пользователей:

Человек A: «У Angular больше пользователей, чем у React!»

Человек Б: «Нет, у React больше пользователей, чем у Angular!»

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

Вы можете подумать: «Эти законы кажутся мне здравым смыслом!» Если да, то отлично! По-прежнему важно осознавать их значение в принятии решений, и вы можете увидеть их влияние в поиске недостатков в наших рассуждениях в будущих публикациях.

Срок действия

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

Кэт предпочитает либо Redux, либо MobX.
Кэт не предпочитает MobX.
Следовательно, Кэт предпочитает Redux.

Этот аргумент логически верен, потому что за заключением следуют предпосылки. Учитывая наше первоначальное утверждение о том, предпочитает ли Кэт Redux или MobX, если наше второе утверждение верно, то вывод гарантированно будет верным. Если наше второе утверждение ложно, наш вывод гарантированно будет ложным. Однако веский аргумент не гарантирует истины:

У всех массивов есть свойство длины.
У этого объекта есть свойство длины.
Следовательно, этот объект является массивом.

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

Разумность

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

GitHub - самая популярная платформа управления версиями.
GitHub утверждает, что JavaScript - самый популярный язык на его платформе.
Следовательно, JavaScript - лучший язык.

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

Почему я должен заботиться о логике при принятии решений?

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

Скептицизм

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

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

Применение в программном обеспечении

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

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

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

До скорого!

Часть 2: Заблуждение Соломенного Человека