Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Elements of Programming Style (HackConf 2019)

The Elements of Programming Style (HackConf 2019)

1be785d1d788b82929e55fc83a9f0aaa?s=128

Bozhidar Batsov

October 13, 2019
Tweet

Transcript

  1. None
  2. Привет!

  3. None
  4. None
  5. Божидар

  6. @bbatsov

  7. None
  8. None
  9. Why am I here?

  10. None
  11. None
  12. size=2 start=0 c=['Н', 'Н' ,'Н' ,'Н' ,'Н','Н','Н','Н','Н','Н','Н','Н','Н','Н'] code_dictionary=Array.new() begin_size_code_dictionary=Array.new() end_string=String.new()

    code_dictionary=c.uniq.to_a decode_dictionary=c.uniq.to_a for i in 0...code_dictionary.size begin_size_code_dictionary[i]=i end c.size.times{ if !code_dictionary.include?(c[start,size].to_s)#Comparation code_dictionary.push(c[start,size].to_s.chomp) start=start+(code_dictionary.last.size)/2-1 size=2 else size+=1; end } end_code=Array.new(code_dictionary.size) for i in begin_size_code_dictionary.size...code_dictionary.size end_code[i]=code_dictionary.index(code_dictionary[i].chop.chop)+1 end_string+=code_dictionary[i].chop.chop end govnokod.ru
  13. The Elements of Style in Programming by Bozhidar Batsov

  14. Languages are hard

  15. None
  16. Basic usage of a language is easy

  17. Айн-цу-цвайн-цу-дрън

  18. "Ту партс, съмтаймс люн, съмтаймс уин, соу, фърст дей релякс"

  19. The correct usage of a language is hard

  20. The effective usage of a language is very hard

  21. None
  22. Българската политика е лайно в целофан.

  23. На малко прасе и нов началник никога не се радвам.

  24. Всичко хубаво в тая държава сме го направили ние, те

    не могат да го боядисат - от метрото до Северната дъга, Тракия, Марица, Струма…
  25. Живков и царя са ми като два университета. В една

    тема и двамата бяха много единни, че България и държавата са над всичко.
  26. Да мачкаш Цветанов е все едно с голо дупе таралеж

    да мачкаш.
  27. not really

  28. try 10 years

  29. http://norvig.com/21-days.html Teach Yourself Programming in Ten Years Peter Norvig

  30. None
  31. Laziness is a virtue

  32. None
  33. Use the active voice.

  34. My first visit to Pernik will always be remembered by

    me. lame
  35. I shall always remember my first visit to Pernik. legit

  36. The word personally is often unnecessary.

  37. Personally, I love Emacs.

  38. A Style Guide • a curated set of (supposedly) good

    practices • spares you the process of making trivial decisions • allows you to focus on the actual problems • simple and concise
  39. Style guides aren’t a replacement for thinking

  40. Programs must be written for people to read, and only

    incidentally for machines to execute. — Hal Abelson
  41. Similar rules apply to natural and programming languages

  42. None
  43. English

  44. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do

    eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Chapter I
  45. LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT, SED DO

    EIUSMOD TEMPOR INCIDIDUNT UT LABORE ET DOLORE MAGNA ALIQUA. UT ENIM AD MINIM VENIAM, QUIS NOSTRUD EXERCITATION ULLAMCO LABORIS NISI UT ALIQUIP EX EA COMMODO CONSEQUAT. DUIS AUTE IRURE DOLOR IN REPREHENDERIT IN VOLUPTATE VELIT ESSE CILLUM DOLORE EU FUGIAT NULLA PARIATUR. EXCEPTEUR SINT OCCAECAT CUPIDATAT NON PROIDENT, SUNT IN CULPA QUI OFFICIA DESERUNT MOLLIT ANIM ID EST LABORUM. LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT, SED DO EIUSMOD TEMPOR INCIDIDUNT UT LABORE ET DOLORE MAGNA ALIQUA. UT ENIM AD MINIM VENIAM, QUIS NOSTRUD EXERCITATION ULLAMCO LABORIS NISI UT ALIQUIP EX EA COMMODO CONSEQUAT. DUIS AUTE IRURE DOLOR IN REPREHENDERIT IN VOLUPTATE VELIT ESSE CILLUM DOLORE EU FUGIAT NULLA PARIATUR. EXCEPTEUR SINT OCCAECAT CUPIDATAT NON PROIDENT, SUNT IN CULPA QUI OFFICIA DESERUNT MOLLIT ANIM ID EST LABORUM. chapter i
  46. Български

  47. Правителство трябва да има на всяка цена, каза премиерът проф.

    Георги Близнашки пред журналисти в Котел, където беше по повод Деня на будителите. "Силно се надявам, че в следващите няколко дни, особено след като бъде връчен проучвателен мандат, разговорите ще придобият по-спокоен тон и ще се стигне до съставяне на правителство", заяви министър- председателят, цитиран от правителствената информационна служба. Той прогнозира тежки първи месеци за следващия кабинет, който трябва да предприеме неотложни и "не особено популярни мерки". Близнашки изрази надежда, че след това нещата ще тръгнат във възходяща линия, благодарение на финансовия ресурс, предвиден за страната ни по Споразумението за партньорство на ЕК с България до 2020 година. Глава 1
  48. ПРАВИТЕЛСТВО ТРЯБВА ДА ИМА НА ВСЯКА ЦЕНА, КАЗА ПРЕМИЕРЪТ ПРОФ.

    ГЕОРГИ БЛИЗНАШКИ ПРЕД ЖУРНАЛИСТИ В КОТЕЛ, КЪДЕТО БЕШЕ ПО ПОВОД ДЕНЯ НА БУДИТЕЛИТЕ. "СИЛНО СЕ НАДЯВАМ, ЧЕ В СЛЕДВАЩИТЕ НЯКОЛКО ДНИ, ОСОБЕНО СЛЕД КАТО БЪДЕ ВРЪЧЕН ПРОУЧВАТЕЛЕН МАНДАТ, РАЗГОВОРИТЕ ЩЕ ПРИДОБИЯТ ПО-СПОКОЕН ТОН И ЩЕ СЕ СТИГНЕ ДО СЪСТАВЯНЕ НА ПРАВИТЕЛСТВО", ЗАЯВИ МИНИСТЪР-ПРЕДСЕДАТЕЛЯТ, ЦИТИРАН ОТ ПРАВИТЕЛСТВЕНАТА ИНФОРМАЦИОННА СЛУЖБА. гЛаВа 1 ТОЙ ПРОГНОЗИРА ТЕЖКИ ПЪРВИ МЕСЕЦИ ЗА СЛЕДВАЩИЯ КАБИНЕТ, КОЙТО ТРЯБВА ДА ПРЕДПРИЕМЕ НЕОТЛОЖНИ И "НЕ ОСОБЕНО ПОПУЛЯРНИ МЕРКИ". БЛИЗНАШКИ ИЗРАЗИ НАДЕЖДА, ЧЕ СЛЕД ТОВА НЕЩАТА ЩЕ ТРЪГНАТ ВЪВ ВЪЗХОДЯЩА ЛИНИЯ, БЛАГОДАРЕНИЕ НА ФИНАНСОВИЯ РЕСУРС, ПРЕДВИДЕН ЗА СТРАНАТА НИ ПО СПОРАЗУМЕНИЕТО ЗА ПАРТНЬОРСТВО НА ЕК С БЪЛГАРИЯ ДО 2020 ГОДИНА.
  49. Ruby

  50. def some_method do_something do_more do_more end

  51. def some_method do_something do_more do_more end

  52. sum = 1 + 2 a, b = 1, 2

    [1, 2, 3].each { |e| puts e } class FooError < StandardError; end
  53. sum=1+2 a,b=1,2 [1,2,3].each{|e|puts e} class FooError<StandardError;end

  54. Elementary Rules of Usage

  55. English

  56. Form possessive singular of nouns by adding ’s.

  57. Bozhidar’s talk Batman’s batclaw Emacs’s magic

  58. Ruby

  59. Form predicate method names by adding “?”.

  60. even? completed? batman?

  61. None
  62. Elementary Principles of Composition

  63. English

  64. Make the paragraph the unit of composition.

  65. Ruby

  66. Make the method the unit of composition.

  67. English

  68. Omit needless words.

  69. he is a man who

  70. Her story is a strange one.

  71. Ruby

  72. Omit needless words.

  73. if some_condition then # body omitted end

  74. def some_method # ... return result end

  75. None
  76. Words and Expressions Commonly Misused

  77. English

  78. farther further

  79. Do we have to go much farther?

  80. I decided to pursue the subject further.

  81. Ruby

  82. == === equal? eql?

  83. None
  84. An Approach to Style

  85. Be consistent

  86. English

  87. The user should update his config accordingly. They should also

    check…
  88. The user should update his config accordingly. They should also

    check…
  89. Ruby

  90. def something coll coll.collect(&:ala) end def something2(coll) coll.map { |x|

    x.bala } end
  91. Be clear

  92. Български

  93. БМВ

  94. Бързо мощно возило

  95. КТБ

  96. Коварен Терански Батълкруузър

  97. АБПФК

  98. Активен борец против фашизма и капитализма

  99. Ruby

  100. $:

  101. $LOAD_PATH

  102. $;

  103. $FIELD_SEPARATOR

  104. $*

  105. $ARGV

  106. '%d %d' % [20, 10]

  107. sprintf('%d %d', 20, 10)

  108. sprintf( '%{first} %{second}', first: 20, second: 10 )

  109. format('%{first} %{second}', first: 20, second: 10)

  110. Ruby is optimized for programmer happiness

  111. Ruby is a huge language

  112. Making the “right” decisions is hard

  113. None
  114. puts "Hello, HackConf!" puts "Hello, HackConf!" puts "Hello, HackConf!”

  115. for i in 1..3 puts "Hello, HackConf!” end

  116. 3.times do puts "Hello, HackConf!” end

  117. result = [] names.each do |word| result << name.upcase end

  118. names.map { |name| name.upcase }

  119. names.map(&:upcase)

  120. names.map(_1.upcase)

  121. None
  122. None
  123. Are all those options even worth our while?

  124. None
  125. None
  126. None
  127. 56 simple rules

  128. Format a program to help the reader understand it.

  129. Write clearly -- don't be too clever.

  130. def user_signed_in? !!@current_user end def user_signed_in? !@current_user.nil? end

  131. Don't sacrifice clarity for small gains in efficiency.

  132. i = 1 res = 0 while i <= 10

    res += i i += 1 end
  133. (1..10).reduce(:+)

  134. (N * (N + 1)) / 2

  135. (10 * (10 + 1)) / 2

  136. Don't diddle code to make it faster -- find a

    better algorithm.
  137. •Make it right before you make it faster. •Make it

    fail-safe before you make it faster. •Make it clear before you make it faster.
  138. Instrument your programs. Measure before making efficiency changes.

  139. Use variable names that mean something.

  140. a s l

  141. age sex location

  142. age_over_18?

  143. adult?

  144. Don’t repeat yourself.

  145. Parenthesize to avoid ambiguity.

  146. x || y && z

  147. x || (y && z)

  148. Keep the code & its comments in sync.

  149. # This method does bla bla bla. # It returns

    an array of results. def bla_bla_bla res = Set.new # ... res end
  150. bla_bla_bla[0] # => Boom Boom Pow bla_bla_bla.uniq # => Kaboom!

  151. //private instance variable for storing age public static int age;

  152. //private instance variable for storing age public static int age;

  153. //private instance variable for storing age public static int age;

  154. None
  155. Don’t repeat the code in the comments.

  156. # increment counter by 1 counter += 1

  157. Don’t comment shitty code — fix it.

  158. // // Dear maintainer: // // Once you are done

    trying to 'optimize' this routine, // and have realized what a terrible mistake that was, // please increment the following counter as a warning // to the next guy: // // total_hours_wasted_here = 42 //
  159. Fuck this shit!!!

  160. None
  161. Style guides for programming languages

  162. Python

  163. PEP-8 http://legacy.python.org/dev/peps/pep-0008/

  164. Java

  165. Sun Style Guide http://www.oracle.com/technetwork/java/codeconvtoc-136057.html

  166. Google Style Guide https://google-styleguide.googlecode.com/svn/trunk/javaguide.html

  167. Go

  168. Effective Go https://golang.org/doc/effective_go.html

  169. gofmt

  170. None
  171. StandardJS https://standardjs.com/

  172. None
  173. PHP FIG Coding Style Guide http://www.php-fig.org/psr/psr-1/ http://www.php-fig.org/psr/psr-2/

  174. None
  175. Ruby Style Guide https://rubystyle.guide

  176. None
  177. Clojure Style Guide https://guide.clojure.style

  178. Languages are always evolving

  179. Good style practices are evolving as well

  180. { :batman => 'Bruce', :superman => 'Clark', :zorro => 'Diego',

    :catwoman => 'Selina' }
  181. { batman: 'Bruce', superman: 'Clark', zorro: 'Diego', catwoman: 'Selina' }

  182. Style consistency is of paramount importance

  183. Community Personal Project Company

  184. Community Project Company

  185. Style separates the good from the great

  186. Felina

  187. One more thing…

  188. None