This is second edition of my keynote "On Being a Professional Software Developer" with slide comments (in Russian) which contain main ideas of the keynote.
I hope the slides could be used as a standalone reading material.
3. Agenda
What is this talk about
● Developers’ Essence
● Computer Science
● Polyglot Programming
● Evolution
What is this talk not about
● Agile
● Soft Skills
● How to Sell ABC to XYZ
4. Software Developer
A person concerned with facets of the software
development process. Their work includes
researching, designing, implementing, and
testing software. A software developer may take
part in design, computer programming, or
software project management. They may
contribute to the overview of the project on the
application level rather than component-level or
individual programming tasks.
Wikipedia
5. Software Engineering
The required techniques of effective reasoning are pretty
formal, but as long as programming is done by people that
don't master them, the software crisis will remain with us
and will be considered an incurable disease. And you know
what incurable diseases do: they invite the quacks and
charlatans in, who in this case take the form of Software
Engineering gurus.
Dijkstra "Answers to questions from students of Software Engineering" (2000)
6. Beauty?
Beauty is more important in computing than anywhere else in
technology because software is so complicated. Beauty is
the ultimate defense against complexity.
David Gelernter, “Machine Beauty: Elegance and the Heart of Technology”
7. Programming = Art
We have seen that computer programming is an art,
because it applies accumulated knowledge to the world,
because it requires skill and ingenuity, and especially
because it produces objects of beauty. A programmer
who subconsciously views himself as an artist will enjoy
what he does and will do it better.
D. Knuth, Computer Programming as an Art (1974)
11. Toolset is Legacy
“I suppose it is tempting, if the only tool you
have is a hammer, to treat everything as if it
were a nail”
― Abraham Maslow
“The tools we use have a profound (and
devious!) influence on our thinking habits,
and, therefore, on our thinking abilities”
― Edward Dijkstra
13. Math & Abstraction
The effective exploitation of his powers of abstraction must
be regarded as one of the most vital activities of a
competent programmer.
E.W. Dijkstra, The Humble Programmer(1972)
Abstraction in mathematics is the process of extracting
the underlying essence of a mathematical concept,
removing any dependence on real world objects with
which it might originally have been connected, and
generalizing it so that it has wider applications or
matching among other abstract descriptions of
equivalent phenomena.
14. Abstraction in CompSci
● Languages:
● OOP
● Functional
● Modern Lisps
● Control flow
● Abstract Data Types
● Lambda Abstraction
● Layered Architecture
15. Abstraction Principle
Each significant piece of functionality in a
program should be implemented in just one
place in the source code. Where similar
functions are carried out by distinct pieces of
code, it is generally beneficial to combine
them into one by abstracting out the varying
parts.
Benjamin C. Pierce in Types and Programming Languages (2002)
16. Why Math
•
•
•
•
•
•
Understanding function convexity very deeply
Using induction to prove a recursive algorithm
Formal correctness proofs
DFAs, NFAs, Turing Machines, and theoretical computation in general
It makes a lot computer science concepts easier
Specific concepts applicable to computer science are covered arguably
more deeply by mathematics
•
•
•
Diversity of paradigms
Precision and skepticism
Math people are really smart =)
17. (Very) Applied Mathematics
● (Pure) Functions and State Machines ->
Stateful/Stateless Services Models
● HOF -> DI/IoC
● Set Theory -> SQL Joins
● Probability Theory -> Load Balancing,
25. Why Data Structures & Algorithms
●
Queues:
o Any Queueing processes
o Distributed Persistent Queues for Event Processing
•
Bloom filters:
•
•
o Used by Cassandra to check which SSTables mostly contains the key
o Hbase also uses it to optimize the reads
Trees:
o KV Database designing
o Creating file system (S-Tree in HDFS)
o Suffix tree: Genomic sequencing
o Zoology: Maintaining the structures of the entire animal & plant kingdom.
o Social Networks : Establishing relations between users based on some key
B-Trees (Binary Trees):
o
o
•
E-commerce : while accessing unique keys. B-Trees balanced multi-way search tree of
order N.
Searching : Searching quickly for a given element
Skip Lists:
o
Implementation of ordered sets - Redis datastore
26. Single Example: Graphs
•
•
•
Search (PageRank)
The Facebook news feed & Facebook Graph Search.
Google Navigation and Google Directions on top of Google Maps uses some very efficient planar
graph shortest path algorithms.
•
•
•
•
•
•
Compilers use graph traversals to find code dependencies.
Graph coloring algorithms are used when optimizing the code for parallel uses of the CPU registers.
CPU layout design problems are modeled as graph problems.
Memory garbage collection strategies may use graph traversals.
Inventory allocation in web advertising can be written as a network flow problem.
Data replication problems frequently use minimal spanning tree algorithms to keep the bandwidth use
down
•
Most big data processing pipelines involve a series of interdependent steps that can be modeled as a
directed acyclic graph.
28. Programming Languages
About the use of language: it is impossible to
sharpen a pencil with a blunt axe. It is equally
vain to try to do it with ten blunt axes instead.
E.W. Dijkstra, How do we tell truths that might hurt?(1975)
29. Why Polyglot Programming Matters
● Most interesting open-source projects are in different
language than yours (Storm, Finagle)
● Lay back and relax in Turing’ Tarpit
● Concurrency Idioms (Shared Memory, Actors, STM)
● Write once - run anywhere! JVM is mature enough to
host new languages (and they appear!)
● We don’t need most of GoF Patterns in FP!
● There are a complete frameworks build around lack of
some features in core language (DI containers)
30. Why Polyglot Programming Matters
● Another level of abstraction
● You can borrow design ideas from other
languages (e.g. I am a lambda junkie)
● Different understanding of things (address
arithmetic, OOP, HOF, Monads etc.)
● Effective reasoning (map and reduce)
● Idiomatic code: ceremony vs. conciseness
Abstract away from language!
31. Language Landscape is Changing
FORTRAN —"the infantile disorder"—, by now nearly 20 years old, is
hopelessly inadequate for whatever computer application you have in mind
today: it is now too clumsy, too risky, and too expensive to use.
PL/I —"the fatal disease"— belongs more to the problem set than to the
solution set.
It is practically impossible to teach good programming to students that
have had a prior exposure to BASIC: as potential programmers they are
mentally mutilated beyond hope of regeneration.
The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offence.
APL is a mistake, carried through to perfection. It is the language of the
future for the programming techniques of the past: it creates a new
generation of coding bums.
33. FizzBuzz: Java
for (int i = 1; i <= 100; i++){
if ((i % 15) == 0){
System.out.println("FizzBuzz");
} else if ((i % 3) == 0){
System.out.println("Fizz");
} else if ((i % 5) == 0){
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
34. FizzBuzz: Java
for (int i = 1; i <= 100; System.out.println(++i
% 3 == 0 ? i % 5 == 0 ? "Fizzbuzz" : "Fizz" : i
% 5 == 0 ? "Buzz" : i));
35. FizzBuzz: Scala
(1 to 100) map { x =>
(x % 3, x % 5) match {
case (0,0) => "FizzBuzz"
case (0,_) => "Fizz"
case (_,0) => "Buzz"
case _ => x toString
}
} foreach println
40. Evolve!
● Wiki that!
● Build a robot!
● Attack a book!
● Compete!
● Toy projects!
● Open-source!
● Coursera?
41. Enjoy the Community!
● Attend conferences, check!
● Attend meetups in Your city
● Share Your knowledge, sync with community!
Ads =)
42. Recap
● Computer programming is the core competency
● Don’t depend on market
● Abstraction as main tool
● Choose field, not framework
● Be polyglot
43. First they ignore you, then they laugh at
you, then they fight you, then you win
Mahatma Gandhi
Я Антон Кириллов, разрабатываю серверные платформы в ZeptoLab.
Немножко понимаю в Computer Science, занимаюсь распределенными системами и обожаю программирование!
Сегодняшний доклад на очень серьезную тему, я постараюсь поделиться своими взглядами на профессию, как она представляется мне.
В докладе я попробую раскрыть суть профессии разработчика, почему нам нужно знать Computer Science и математику, почему важно знать больше одной парадигмы программирования и немного о том, как развиваться и как подходить к обучению.
В этом докладе вы не найдете ничего о процессных практиках, навыках общения и переписки, а так же ответов на вопросы “как продать какую-то практику какому-то начальнику”
Котиков не будет!
Итак, я долго искал адекватное определение разработчика программного обеспечения, и не смог найти чего-то внятного и однозначного, поэтому привожу определение из Википедии.
Мы видим, что разработчик ПО - это человек, который имеет дело с аспектами разработки ПО, его работа включает исследование, проектирование, имплементацию и тестирование ПО. Пока вроде все нормально. Разработчик может принимать участие в проектировании, программировании и проджект менеджменте. Бла-бла-бла…
На самом деле, ключевой компетенцией разработчика являются навыки программирования!
И тут я подумал: “Почему определение так размыто? Почему тестирование обособлено? Причем здесь проджект менеджмент вообще?” Почему ключевой аспект профессии окружен всем этим мусором?
Какая-то несфокусированная профессия: вроде занимается всем, а чем конкретно - непонятно. И вообще, это слово “проект” никакого отношения к разработке не имеет. Вы можете вполне обоснованно возразить, что это кодеры по ТЗ кодят легаси, а разработчик, он такой весь еще владеет практиками программной инженерии, которая включает в себя управление проектами.
Мы сейчас будем фокусироваться, отбрасывать лишнее и, наконец, придем к сути программирования и программистов.
Под вывеской “программная инженерия” скрывается на самом деле опасный враг, который говорит нам о том, что необходимо заменить интеллектуальные дисциплины управленческими. Эти процессные практики говорят нам как программировать, если мы не умеем. Подумайте, ведь действительно адаптивное планирование спринтов с планинг покером позволяет нам оценить сроки в относительных величинах, независимо от уровня и способностей команды. А ведь навыки программистов - это ключевая вещь, которая влияет на успех, качество и сроки продукта, независимо от того какой процесс вы используете!
Дейкстра еще в 70-х начал говорить о неком “софтверном кризисе”, и практически до самой смерти он пропагандировал одну простую и понятную мысль: что до тех пор, пока программированием занимаются люди, которые не знают формальных подходов к рассуждениям (логика), кризис будет только усиливаться.
В классических метриках программных продуктов отсутствует понятие красоты! А ведь элегантность программного обеспечения напрямую влияет на качество!
Красота важна в программировании больше, чем где-либо в технологии потому, что программное обеспечение очень сложное. Красота - единственно верное средство борьбы со сложностью!
Переводя на понятный язык, под красотой мы понимаем ключевые метрики качества ПО:
читабельность, расширяемость, масштабируемость, поддерживаемость и даже понятность!
Отсутсвие красоты сажает вас в яму технического долга, из которой мало кто выбирался.
Программирование является исскуством, потому что использет накопленные знания о мире, потому что требует навыков и изобретательности и особенно потому что производит обекты изящества! И самое главное, программист, который подсознательно воспринимает себя как творца, наслаждается тем, что он делает и делает это еще лучше!!!
И именно программирование является стержнем профессии! За последние десятилетия программирование обросло ритуалами, фокус размылся, начал смещаться с сути программирования на разнообразные практики.
Это вообще не связано с предыдущим слайдом и представляет ключевой тулсет для программера.
Здесь мы видем, что программер 80-го уровня должен знать достаточно нестандартные структуры данных, такие как красно-черные деревья, скип листы, трайс. Может определять задачи динамического программирования, алгоритмы на графах, NP проблемы. Понимает, как его программы исполняются непосредственноа на железе, как работает сборка мусора, статическое и динамическое связывание.
Эти навыки маст-хэв, чтобы быть хотя бы средним программером. Это то, что спрашивают на собеседованиях любые серьезные компании и да, это весьма интересно =)
Если вы посмотрите ссылку, то из теоретических основ CompSci развитый программист должен ознакомиться с SICP, а если по этой книге занимались, то в конце вы написали интерпретатор лиспа..
Давайте посмотрим на индустрию и требования рынка.
Сегодня рынок диктует разные условия, Тренды возникают и исчезают, создают шум и пропадают или становятся стандартами.
Примеры такий всплесков, это Big Data, MapReduce, сейчас очень популярна такая штука, как Data Science.
На самом деле, если посмотреть на список знаний, необходимых дата сайентисту - там нет ничего особенного, немного математики, немного программирования, алгоритмов и структур данных. Статистика и визуализация. Остальное - шум, который добавлен туда непонятно по какому признаку. Например OLAP как Fundamentals - это что такое вообще? Что это знание подразумевает?
Тем не менее, возникновение все более наукоемких прикладных областей является позитивным фактором. Сегодняшние задачи бросают новые вызовы, ответить на которые старыми методами невозможно. Требуется все больше и больше знаний для решения задач. Но это увы в R&D и прочих наукоемких областях. Я попробовал категоризовать потребности рынка и разбил их на 4 большие группы.
Widespread technologies a similar to smoking: not necessary that they are good.
В реальности требования рынка очень специфичны и узкосфокусированы.
На мой взгляд, технологии, которые сейчас востребованы можно разделить на 4 группы. Давайте посмотрим на них еще и с точки зрения проблем, которые они решают.
“Научные” определяют формальные средства для решения неких фундаментальных проблем. Как правило представляют некую модель, в терминах которой формулируется проблема и решение. Зачастую не имеют имплементации. Можно вспомнить, как возникли языки программирования.
“Подход” предлагает решение уже некой конкретной, измеримой проблемы и имеет более узкий фокус, чем научная группа. Здесь мы уже имеем дело с некими готовыми продуктами.
“Framework'и”являются еще более узкой нишей, сфокусированной на решении вполне конкретных задач разработки. С их помощью часть проблемы уже решена, часть – ваше решение.
А что же “языки”? Какие проблемы они решают? Язык позволяет решать все те же проблемы, только без привнесения сложности, которую дают фреймворки и готовые решения. Язык дает программисту возможность более точно и точечно формулировать решение проблемы. Реализовывать алгоритм.
По поводу научной группы сразу понятно, что либо вы работаете в этой сфере, либо нет. Машинное обучение в системе учета времени не нужно. Такие технологии не введешь, потому что придется выдумывать проблему, которую потом решать.
С коробочными решениями попроще, они меньше зависят от области, но зависят, а так же являются готовым решением проблемы, и вы пытаетесь не изучить подход к решению проблемы, а научиться пользоваться новым молотком.
Фреймворки поинтереснее, там решены проблемы разработки и интеграции, а разработчику остается сконфигурировать XML, и дописать немного бизнес-логики. Фреймворк надо знать еще лучше и хорошо понимать его. В общем, никто не любит легаси, но все обожают ковыряться с фреймворками =)
Какие выводы можно из этого сделать: рынок требует знаний конкретных инструментов, а не методов решения задач. Конкретные подходы (типа ООП) против научных доказательств. Юнит тесты вместо формальных моделей.
Чтобы найти работу, нужно знание стнадартных инструментов, которые используются везде. К чему это приводит, хорошо ли знание СТАНДАРТНЫХ инструментов?
Эти фреймворки и библиотеки, которые требует от нас рынок, спринг-хибернейт-от-года - это молотки, которыми забивают гвозди, шурупы, скобки для степлера, скрепки и монтажный клей тоже забивают
Эти вещи лишают нас возможности думать, ведь не зря они называются РЕШЕНИЯ! Тебе не надо ничего делать, просто правь XML, бери мануал, интегрируй.
Инструменты имеют огромное влияние на наши мыслительные привычки и, как следствие на наши умственные способности!
В чем тогда заключается НАВЫК программиста? В умении пользоваться уже готовыми решениями? Кто любит легаси? Кто-нибудь любит? Ну вот, но зато все любят Спринг и Хибернейт, которые и есть легаси, потому что они не позволяют вам сделать иначе, чем предусмотрено!
Мы не можем просто взять и использовать фреймворк, нужно уметь моделировать абстракции, иметь общирный инструментарий и знания.
Нам нужна математика, как механизм для формализации и абстракции, CompSci в качестве тулбокса для дизайна решений и языки программирования для реализации.
Кто-то скажет, что языки - это тоже инструменты. Это отчасти правда, языки оказывают огромное влияние на образ мышления. Однако, основой языка является формальная математика и аксиоматический аппарат, позволяющий формально доказывать корректность тех или иных утверждение и заключений!
Эффективное использование возможнойстей абстракции должно являться ключевым навыком компетентного программиста!
Математика предоставляет нам роскошнейший аппарат для этого. Давайте разбираться.
Самая популярная абстракция сегодня - это *AAS,
Мы также можем представить программу как функцию от огромного количества переменных!
Если мы вспомним дискретную математику, то метод класса является функцией, а входные и выходные данные принадлежат множествам значений заданных для их типов.
В математике абстракция - это процесс извлечения неких ключевых свойств рассматриваемого объекта и полное его отделение от реального мира и обобщение таким образом, чтобы этот объект был использован для описания схожих феноменов.
В CompSci существуют следующие базовые наиболее известные абстракции, позволяющие рассуждать в общих терминах
Каждая значимая часть функционала программы должна быть реализована только единожды в исходном коде. Там, где схожие функции выполняются в разных местах, в общем случае выгодно объединить их, абстрагировавшись от различающихся деталей
- наследование отличный пример
Еще есть популярный DRY принцип, don’t repeat yourself
Как доказать, что сортировка работает корректно
В некоторых случаях без математики вообще невозможно корректно решить задачу (свертка, скользящее среднее, статистика, наконец)!
It is the systematic study of the feasibility, structure, expression, and mechanization of the methodical processes (or algorithms) that underlie the acquisition, representation, processing, storage, communication of, and access to information, whether such information is encoded in bits and bytes in a computer memory or transcribed in genes and protein structures in a human cell.[1] A computer scientist specializes in the theory of computation and the design of computational systems.[2]
Различные аспекты и области CS и представляют специализацию и инструментарий, а не спринг-хибернейт-от-года.
вообще, Computer Science очень большая наука, которая содержит очень много разделов. Как теоритических, так и прикладных.
Я просто быстро покажу, насколько эта наука обширна и интересна и приведу несколько примеров.
Theory of computation: the fundamental question underlying computer science is, "What can be (efficiently) automated?"[11] The study of the theory of computation is focused on answering fundamental questions about what can be computed and what amount of resources are required to perform those computations. In an effort to answer the first question, computability theory examines which computational problems are solvable on various theoretical models of computation. The second question is addressed by computational complexity theory, which studies the time and space costs associated with different approaches to solving a multitude of computational problems.
The famous "P=NP?" problem, one of the Millennium Prize Problems,[40] is an open problem in the theory of computation.
Надо категории добавить (типа теория вычислимости, построение и анализ) про каждый кратенько (совсем) сказать
Данные разделы предоставляют формальные средства анализа и доказательства корректности программ.
Мы должны уметь доказывать правильность программ, а не только наличие тестов!
Сегодня в работе это скорее всего не пригодится, но это потрясающе интересные разделы CompSci.
Если у вас есть амбиции создания собственного языка программирования, то без этого точно не обойтись!
Данные разделы предоставляют формальные основания программирования в целом
С прикладной точки зрения все гораздо интереснее
С прикладной точки зрения все гораздо интереснее
Направление счетное конечное множество)) всегда есть что выбрать, где развиваться.
Вот, все жалуются, что это нужно только для собеседований и прочей ерунды. Ничего подобного, давайте смотреть!
(в завершение сказать, что без определенных знаний вы вообще не сможете решать некоторые типы задач эффективно)
Тут приведены лишь некоторые примеры использования различных структур данных
Такая абстракция как граф используется для решения огромного числа задач!
Как только программиста уводят подальше от математики, сложности и сути программирования появляется пиздец. Вы когда-нибудь видели хотя бы какую-нибудь адекватную реализацию около-натурального DSL?
“Wouldn't it be nice, for instance, to have programs in almost plain English, so that ordinary people could write and read them?”
Дейкстра
Не стоит ориентироваться на индустрию и не смотреть никуда, кроме мейнстримовых языков и библиотек.
Знание различных языков и парадигм позволяет смотреть на одну и ту же проблему с разных сторон
Дейкстра был специфическим человеком, но данные высказывания показательны тем, что ландшафт языков изменчив, и никогда на будет одного универсального языка. Языки появляются и исчезают, программирование остается.
Раньше было большой проблемой вводить новые языки на своих проектах, потому что плохая интероперабельность, куча батхерта, сомнительный перформанс. Сейчас JVM по-честному хорош, много JVM-языков.
Ландшафт языков очень сильно меняется, и чтобы остаться в седле, придется с этим смириться
Все и так пишут на 6 Java и есть много реактивных областей типа банкинга, где так и будет
Чтобы быть продуктивным разработчиком, недостаточно просто владеть набором библиотек (спрингхибернейтотгода), Mongo и т.д.
JVM языки интероперабельны. Scala позволяет писать в смешанном стиле, что позволяет плавно переползать с Java, но имеет минус : кто как хочет так и пишет
Некоторые мысли крайне сложно выражать в некоторых языках. Java принуждает декомпозировать свои идеи до уровня предметов - объектов
Немного кодопримеров
В Java 8 ситуация не сильно отличается
Конечно, хоть это и выглядит очень круто, но суть остается той же, что и в предыдущем примере
Ваши коллеги убьют вас, если увидят такое. я бы убил этого умника))
Что примечательно, здесь сразу можно заметить функциональную композицию, что уже позволяет эффективно рассуждать о написанном коде
Знакомо?
Как бы усердно процессные практики не внедрялись, все они прилипалы к программингу, не забывайте этого! Оджайл не исправит плохого программиста!
Не ориентируйтесь на рынок, ориентируйтесь на знания,
Абстракции как основной инструмент, математика дает роскошный аппарат
CompSci огромен, не упирайтесь в одну область, не бойтесь исследовать!
Каждый язык general-purpose по-своему, выбирайтесь из смоляной ямы Тьюринга)
Занимайтесь тем, что интересно вам, не бойтесь пробовать - не попробуешь, не узнаешь!
Возможно над вам будут смеятся люди, которые 8 лет пишут проект для большого банка и второй год внедряют Agile. не волнуйтесь, все будет нормально =)