SlideShare a Scribd company logo
1 of 71
# No comment.
# Stop clarifying code with comments;
# Stop clarifying code with comments;
# Write code clearly instead.
# Clarifying comments are not
                                         # documentation

# Converts the object into textual markup given a specific `format`
# (defaults to `:html`)
#
# == Parameters:
# format::
# A Symbol declaring the format to convert the object to. This
# can be `:text` or `:html`.
#
# == Returns:
# A string representing the object in a specified
# format.
#
def to_format(format=:html)
  # format the object
end
# Clarifying comments are not
                                          # documentation



# Converts the object into textual markup given a specific format.
#
# @param [Symbol] format the format type, `:text` or `:html`
# @return [String] the object converted into the expected format.
def to_format(format = :html)
  # format the object
end
# Clarifying comments are not
                                           # legal statements




# Copyright (C) 2012 by Nate Davis Olds. All rights reserved.
# Released under the terms of the GNU General Public License version 2 or later.
# Clarifying comments are not
                                   # reminder notes
# FIXME high priority for next
deploy
def process
 raise “n”
end

# OPTIMIZE refactor this code to
get more done
def goodnight
 sleep 6.hours
end

# TODO any other way to do this?
def process(str=’inter’)
 “use “ + str + ”polation”
end
# Clarifying comments are not
                                   # reminder notes
# FIXME high priority for next     $ rake notes
deploy                             (in /home/foobar/commandsapp)
def process                        app/controllers/admin/users_controller.rb:
 raise “n”                           * [ 20] [TODO] any other way to do this?
end                                  * [132] [FIXME] high priority for next
                                   deploy
# OPTIMIZE refactor this code to    
get more done                      app/model/person.rb:
def goodnight                        * [ 13] [OPTIMIZE] refactor this code to get
 sleep 6.hours                     more done
end

# TODO any other way to do this?
def process(str=’inter’)
 “use “ + str + ”polation”
end
# The attention of the comment
                                                   # is outside the scope
                                                   # of the accompanying code



# used by rake for task management
# TODO any other way to do this?
def process(str=’inter’)
 “use “ + str + ”polation”
end



# used by yard
 # Converts the object into textual markup given a specific format.
 #
 # @param [Symbol] format the format type, `:text` or `:html`
 # @return [String] the object converted into the expected format.
 def to_format(format = :html)
   # format the object
 end



# used by courts
 # Copyright (C) 2012 by Nate Davis Olds. All rights reserved.
 # Released under the terms of the GNU General Public License version 2 or later.
# A clarifying comment’s attention is
# directed internally
 # inserts a string between two other strings
 def process(str=’inter’)
  “use “ + str + ”polation”
 end
# Clarifying comments are
                                               # explanations
                                               # of the code that follows.


# inserts a string between two other strings
def process(str=’inter’)
 “use “ + str + ”polation”
end
# Clarifying comments are
                                 # redundant
                                 # of the code that follows.


# inserts string
def insert_string(str=’inter’)
 “use “ + str + ”polation”
end
# Clarifying comments are
                                             # apologizes
                                             # of the code that follows.


# This code sucks! I know it. You know it.
# I am sorry that you have to read it.
def is_this_example_good
 100.times { ”No! it sucks!” }
end

# I’m drunk.
def string_theory_patterns
 ...
end
# Clarifying comments are
                                            # rants
                                            # of the code that follows.
# At this point, I'd like to take a moment to speak to you about the Adobe PSD
# format. PSD is not a good format. PSD is not even a bad format. Calling it
# such would be an insult to other bad formats, such as PCX or JPEG. No, PSD
# is an abysmal format. Having worked on this code for several weeks now, my
# hate for PSD has grown to a raging fire that burns with the fierce passion
# of a million suns.
#
.....
# Earlier, I tried to get a hold of the latest specs for the PSD file format.
# To do this, I had to apply to them for permission to apply to them to have
# them consider sending me this sacred tome. This would have involved faxing
# them a copy of some document or other, probably signed in blood. I can only
# imagine that they make this process so difficult because they are intensely
# ashamed of having created this abomination. I was naturally not gullible
# enough to go through with this procedure, but if I had done so, I would have
# printed out every single page of the spec, and set them all on fire. Were it
# within my power, I would gather every single copy of those specs, and launch
# them on a spaceship directly into the sun.
#
# PSD is not my favourite file format.
# Clarifying comments are
                                             # open letters
                                             # of the code that follows.



#   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
#
# Clarifying comments are
                                        # warnings
                                        # of the code that follows.


# After you run this code, take the day off.
# It won’t finish until tomorrow.
def im_compiling(stop_at=14.hours.from_now)
 if stop_at < Time.zone.now
   puts "done."
 else
   print "."
   sleep 10
   im_compiling stop_at
 end
end
# Clarifying comments are
                                       # dialogs
                                       # of the coder that follows.


# This is brilliant!
# Thanks. It’s nap time.
def im_compiling(stop_at=14.hours.from_now)
 if stop_at < Time.zone.now
   puts "done."
 else
   print "."
   sleep 10
   im_compiling stop_at
 end
end
# Clarifying comments are
                      # inside jokes
                      # of the code that follows.




stop() # hammertime
# Clarifying comments are
                                        # misleading descriptions
                                        # of the code that follows.




# Returns the standard utility allowance
# based on how many utilities someone pays.
def standard_utility_allowance
 324
end
# Clarifying comments are
                                               # stashed code
def standard_utility_allowance                 # of the code that follows.
 324
 # Uncomment this by March 3, 2012 when estimations switch back
 #
 # case @answers[:utility_allowance]
 #
 # when 'Pays for Heating or # Cooling or receives MEAP or EUSP'
 # 394.0
 #
 # when "Doesn't pay for heating or cooling but pays two other utilities"
 # 239.0
 #
 # when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)"
 # @answers[:actual_utility_cost]
 #
 # when "Pays telephone only"
 # 40.0
 #
 # else
 # 0.0
 # end
end
# Clarifying comments are
                                               # deserted code
                                               # of the code that follows.

def standard_utility_allowance
 case @answers[:utility_allowance]
 when 'Pays for Heating or # Cooling or receives MEAP or EUSP'
  394.0
# when "Doesn't pay for heating or cooling but pays two other utilities"
# 239.0
 when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)"
  @answers[:actual_utility_cost]
 when "Pays telephone only"
  40.0
 else
  0.0
 end
end
# Why should clarifying comments be removed?
# Why should clarifying comments be removed?


# Clarifying comments are codejunk
# Why should clarifying comments be removed?


# Clarifying comments are codejunk
  term from Katrina Owen # talk entitled Therapeutic Refactoring on
  confreaks from Cascadia Ruby Conference
# Why should clarifying comments be removed?


# Clarifying comments are codejunk
    term from Katrina Owen # talk entitled Therapeutic Refactoring on
    confreaks from Cascadia Ruby Conference

    codejunk is a play from Edward Tufté term chartjunk 1




  1 Tufte, Edward R. (1983). The Visual Display of Quantitative Information. Cheshire, CT: Graphics Press.
Chartjunk refers to all visual elements in charts and
graphs that are not necessary to comprehend the
information represented on the graph, or that
distract the viewer from this information.
Codejunk refers to all visual elements in code that
are not necessary to comprehend the information
represented in the code, or that distract the viewer
from this information.
Understanding Code
70%




                                                                      New Code
                                                                      5%




                                              Modifying Existing Code
                                              25%




# http://blogs.msdn.com/b/peterhal/archive/2006/01/04/509302.aspx Peter Hallam
# Why should clarifying comments be removed?
# Why should clarifying comments be removed?



Because we spend most of
our time reading and
understanding code
# Isn’t that why we write clarifying comments?
# Isn’t that why we write clarifying comments?




No. We write clarifying
comments because our code
isn’t clear enough.
The use of a clarifying
comment admits the failure
to write readable, clean code
The use of a clarifying
comment admits the failure
to write readable, clean code

          # Stop clarifying code with comments;
          # Write code clearly instead.
# explanations
# explanations

            # inserts a string between two other strings
            def process(str=’inter’)
             “use “ + str + ”polation”
            end
# explanations

            # inserts a string between two other strings
            def process(str=’inter’)
             “use “ + str + ”polation”
            end



# rename function

            def insert_string(str=’inter’)
             “use “ + str + ”polation”
            end
# redundant comment
# redundant comment

        # inserts string
        def insert_string(str=’inter’)
         “use “ + str + ”polation”
        end
# redundant comment

         # inserts string
         def insert_string(str=’inter’)
          “use “ + str + ”polation”
         end



# without comment


         def insert_string(str=’inter’)
          “use “ + str + ”polation”
         end
# apologizing
# apologizing

         # This code sucks! I know it. You know it.
         # I am sorry that you have to read it.
         def is_this_example_good
          100.times { ”No! it sucks!” }
         end
# apologizing

          # This code sucks! I know it. You know it.
          # I am sorry that you have to read it.
          def is_this_example_good
           100.times { ”No! it sucks!” }
          end


# make it better

          def is_this_example_good
           1000.times { ”Awesome” }
          end
# rants
# rants

# At this point, I'd like to take a moment to speak to you about the Adobe PSD
# format. PSD is not a good format. PSD is not even a bad format. Calling it
# such would be an insult to other bad formats, such as PCX or JPEG. No, PSD
# rants

# At this point, I'd like to take a moment to speak to you about the Adobe PSD
# format. PSD is not a good format. PSD is not even a bad format. Calling it
# such would be an insult to other bad formats, such as PCX or JPEG. No, PSD



# blog about it. tweet it. Or give a presentation about it. Just Remove it from code.


Why I hate Adobe PSD format!
by I. Rant
At this point, I'd like to take a moment to speak to you about the Adobe PSD
format. PSD is not a good format. PSD is not even a bad format. Calling it
such would be an insult to other bad formats, such as PCX or JPEG. No, PSD
# Open letters
# Open letters

        #   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
        #
# Open letters

        #   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
        #

# Schedule a fix. State the problem.

        # OPTIMIZE: or refactor. The problem is....
# warnings
# warnings

# After you run this code, take the day off.
# It won’t finish until tomorrow.
def im_compiling(stop_at=14.hours.from_now)
 if stop_at < Time.zone.now
   puts "done."
 else
   print "."
   sleep 10
   im_compiling stop_at
 end
end
# warnings


# if it is meant to run long, warn at runtime
def im_compiling(stop_at=nil)
 if stop_at.nil?
   print “This will take 14 hours. Proceed? (y/n):”
   should_continue = STDIN.gets.chomp

  if should_continue == “y”
    im_compiling 14.hours.from_now
  end
 elsif stop_at < Time.zone.now
  puts "done."
 else
  print "."
  sleep 10
  im_compiling stop_at
 end
end
# warnings


# schedule optimization

# OPTIMIZE: remove the n+1 database calls
def comment_summaries_for_everyone
 summaries = []

 Person.all.each do |person|
  person.posts.each do |post|
   post.comments.each do |comment|
     summaries << “#{comment.author_name}: #{comment.body}”
   end
  end
 end

 summaries
end
# dialogs

       # This is brilliant!
       # Thanks. It’s nap time.
# dialogs

       # This is brilliant!
       # Thanks. It’s nap time.


# email. chat. twitter. phone. how about talk?!?
# jokes
# jokes

     stop() # hammertime
# jokes

     stop() # hammertime



# funny the first time, but does it need to be checked in? Delete it

     stop()
# misleading descriptions
# misleading descriptions

    # Returns the standard utility allowance
    # based on how many utilities someone pays.
    def standard_utility_allowance
     324
    end
# misleading descriptions

    # Returns the standard utility allowance
    # based on how many utilities someone pays.
    def standard_utility_allowance
     324
    end

# Remove it or investigate what is correct.

    def standard_utility_allowance
     324
    end
# stashed code
def standard_utility_allowance
 324
 # Uncomment this by March 3, 2012 when estimations switch back
 #
 # case @answers[:utility_allowance]
 #
 # when 'Pays for Heating or # Cooling or receives MEAP or EUSP'
 # 394.0
 #
 # when "Doesn't pay for heating or cooling but pays two other utilities"
 # 239.0
 #
 # when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)"
 # @answers[:actual_utility_cost]
 #
 # when "Pays telephone only"
 # 40.0
 #
 # else
 # 0.0
 # end
end
# stashed code
# write it inline, set a note to clean it up
# FIXME: After March 3, 2012
def standard_utility_allowance
 if after_march_3_2012?
   case @answers[:utility_allowance]
   when 'Pays for Heating or # Cooling or receives MEAP or EUSP'
     394.0
   when "Doesn't pay for heating or cooling but pays two other utilities"
     239.0
   when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)"
     @answers[:actual_utility_cost]
   when "Pays telephone only"
     40.0
   else
     0.0
   end
 else
   326
 end
end

def after_march_3_2012?
 Time.zone.now >= Time.new(2012, 3, 3)
end
# deserted code

def standard_utility_allowance
 case @answers[:utility_allowance]
 when 'Pays for Heating or # Cooling or receives MEAP or EUSP'
  394.0
# when "Doesn't pay for heating or cooling but pays two other utilities"
# 239.0
 when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)"
  @answers[:actual_utility_cost]
 when "Pays telephone only"
  40.0
 else
  0.0
 end
end
# deserted code
# remove it. If it passes tests without the code, it is not needed.

def standard_utility_allowance
 case @answers[:utility_allowance]
 when 'Pays for Heating or # Cooling or receives MEAP or EUSP'
  394.0
 when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)"
  @answers[:actual_utility_cost]
 when "Pays telephone only"
  40.0
 else
  0.0
 end
end
A more complex example
# Stop clarifying code with comments;
# Write code clearly instead.
# Questions?



                                                                             # References
                                                          Therapeutic Refactoring, Katrina Owen
                      http://confreaks.com/videos/1071-cascadiaruby2012-therapeutic-refactoring

                                                                                           Chartjunk
                                              http://en.wikipedia.org/wiki/Chartjunk#cite_note-tufte-0

         What Do Programmers Really Do Anyway? (aka Part 2 of the Yardstick saga), Peter Hallam
                             http://blogs.msdn.com/b/peterhal/archive/2006/01/04/509302.aspx

                                                                          Clean Code, Robert Martin




                                                                                       # My Info
Nate Davis Olds   #natedavisolds                                  Benefits Data Trust    lead developer

nate@davisolds.com   ndavisolds@bdtrust.org                                            www.bdtrust.org
No comment

More Related Content

What's hot

HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF
HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARFHES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF
HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARFHackito Ergo Sum
 
Powerpoint presentation final requirement in fnd prg
Powerpoint presentation final requirement in fnd prgPowerpoint presentation final requirement in fnd prg
Powerpoint presentation final requirement in fnd prgalyssa-castro2326
 
P H P Part I, By Kian
P H P  Part  I,  By  KianP H P  Part  I,  By  Kian
P H P Part I, By Kianphelios
 
Ruby -the wheel Technology
Ruby -the wheel TechnologyRuby -the wheel Technology
Ruby -the wheel Technologyppparthpatel123
 

What's hot (9)

HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF
HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARFHES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF
HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF
 
Formation sh
Formation shFormation sh
Formation sh
 
Powerpoint presentation final requirement in fnd prg
Powerpoint presentation final requirement in fnd prgPowerpoint presentation final requirement in fnd prg
Powerpoint presentation final requirement in fnd prg
 
429 e8d01
429 e8d01429 e8d01
429 e8d01
 
Os Borger
Os BorgerOs Borger
Os Borger
 
Perl intro
Perl introPerl intro
Perl intro
 
P H P Part I, By Kian
P H P  Part  I,  By  KianP H P  Part  I,  By  Kian
P H P Part I, By Kian
 
Ruby -the wheel Technology
Ruby -the wheel TechnologyRuby -the wheel Technology
Ruby -the wheel Technology
 
Php Learning show
Php Learning showPhp Learning show
Php Learning show
 

Viewers also liked

Identify Literate Code
Identify Literate CodeIdentify Literate Code
Identify Literate Codenatedavisolds
 
Probability
ProbabilityProbability
Probabilitykrubud
 
ความน่าจะเป็น
ความน่าจะเป็นความน่าจะเป็น
ความน่าจะเป็นTeerayut Matha
 
ความน่าจะเป็น
ความน่าจะเป็นความน่าจะเป็น
ความน่าจะเป็นchantana17
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 

Viewers also liked (7)

Identify Literate Code
Identify Literate CodeIdentify Literate Code
Identify Literate Code
 
Probability
ProbabilityProbability
Probability
 
ความน่าจะเป็น
ความน่าจะเป็นความน่าจะเป็น
ความน่าจะเป็น
 
ความน่าจะเป็น
ความน่าจะเป็นความน่าจะเป็น
ความน่าจะเป็น
 
Event
EventEvent
Event
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 

Similar to No comment

Write your Ruby in Style
Write your Ruby in StyleWrite your Ruby in Style
Write your Ruby in StyleBhavin Javia
 
Reverse-engineering: Using GDB on Linux
Reverse-engineering: Using GDB on LinuxReverse-engineering: Using GDB on Linux
Reverse-engineering: Using GDB on LinuxRick Harris
 
C++ programming language basic to advance level
C++ programming language basic to advance levelC++ programming language basic to advance level
C++ programming language basic to advance levelsajjad ali khan
 
Consequences of using the Copy-Paste method in C++ programming and how to dea...
Consequences of using the Copy-Paste method in C++ programming and how to dea...Consequences of using the Copy-Paste method in C++ programming and how to dea...
Consequences of using the Copy-Paste method in C++ programming and how to dea...Andrey Karpov
 
The First C# Project Analyzed
The First C# Project AnalyzedThe First C# Project Analyzed
The First C# Project AnalyzedPVS-Studio
 
We built this city on Dev and Ops
We built this city on Dev and OpsWe built this city on Dev and Ops
We built this city on Dev and OpsKarthik Gaekwad
 
Code is not text! How graph technologies can help us to understand our code b...
Code is not text! How graph technologies can help us to understand our code b...Code is not text! How graph technologies can help us to understand our code b...
Code is not text! How graph technologies can help us to understand our code b...Andreas Dewes
 
Lecture # 1 introduction revision - 1
Lecture # 1   introduction  revision - 1Lecture # 1   introduction  revision - 1
Lecture # 1 introduction revision - 1SajeelSahil
 
Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Benjamin Bock
 
POLITEKNIK MALAYSIA
POLITEKNIK MALAYSIAPOLITEKNIK MALAYSIA
POLITEKNIK MALAYSIAAiman Hud
 

Similar to No comment (20)

Preprocessor
PreprocessorPreprocessor
Preprocessor
 
Preprocessor
PreprocessorPreprocessor
Preprocessor
 
Write your Ruby in Style
Write your Ruby in StyleWrite your Ruby in Style
Write your Ruby in Style
 
Reverse-engineering: Using GDB on Linux
Reverse-engineering: Using GDB on LinuxReverse-engineering: Using GDB on Linux
Reverse-engineering: Using GDB on Linux
 
C programming session6
C programming  session6C programming  session6
C programming session6
 
C++ programming language basic to advance level
C++ programming language basic to advance levelC++ programming language basic to advance level
C++ programming language basic to advance level
 
C++Basics.pdf
C++Basics.pdfC++Basics.pdf
C++Basics.pdf
 
Consequences of using the Copy-Paste method in C++ programming and how to dea...
Consequences of using the Copy-Paste method in C++ programming and how to dea...Consequences of using the Copy-Paste method in C++ programming and how to dea...
Consequences of using the Copy-Paste method in C++ programming and how to dea...
 
Metaprogramming
MetaprogrammingMetaprogramming
Metaprogramming
 
The First C# Project Analyzed
The First C# Project AnalyzedThe First C# Project Analyzed
The First C# Project Analyzed
 
C tutorials
C tutorialsC tutorials
C tutorials
 
We built this city on Dev and Ops
We built this city on Dev and OpsWe built this city on Dev and Ops
We built this city on Dev and Ops
 
C tutorial
C tutorialC tutorial
C tutorial
 
Alta disponibilidad en GNU/Linux
Alta disponibilidad en GNU/LinuxAlta disponibilidad en GNU/Linux
Alta disponibilidad en GNU/Linux
 
Bash 4
Bash 4Bash 4
Bash 4
 
Code is not text! How graph technologies can help us to understand our code b...
Code is not text! How graph technologies can help us to understand our code b...Code is not text! How graph technologies can help us to understand our code b...
Code is not text! How graph technologies can help us to understand our code b...
 
Lecture # 1 introduction revision - 1
Lecture # 1   introduction  revision - 1Lecture # 1   introduction  revision - 1
Lecture # 1 introduction revision - 1
 
Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)
 
POLITEKNIK MALAYSIA
POLITEKNIK MALAYSIAPOLITEKNIK MALAYSIA
POLITEKNIK MALAYSIA
 
Tdd is not about testing
Tdd is not about testingTdd is not about testing
Tdd is not about testing
 

Recently uploaded

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 

Recently uploaded (20)

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 

No comment

  • 2. # Stop clarifying code with comments;
  • 3. # Stop clarifying code with comments; # Write code clearly instead.
  • 4. # Clarifying comments are not # documentation # Converts the object into textual markup given a specific `format` # (defaults to `:html`) # # == Parameters: # format:: # A Symbol declaring the format to convert the object to. This # can be `:text` or `:html`. # # == Returns: # A string representing the object in a specified # format. # def to_format(format=:html) # format the object end
  • 5. # Clarifying comments are not # documentation # Converts the object into textual markup given a specific format. # # @param [Symbol] format the format type, `:text` or `:html` # @return [String] the object converted into the expected format. def to_format(format = :html) # format the object end
  • 6. # Clarifying comments are not # legal statements # Copyright (C) 2012 by Nate Davis Olds. All rights reserved. # Released under the terms of the GNU General Public License version 2 or later.
  • 7. # Clarifying comments are not # reminder notes # FIXME high priority for next deploy def process raise “n” end # OPTIMIZE refactor this code to get more done def goodnight sleep 6.hours end # TODO any other way to do this? def process(str=’inter’) “use “ + str + ”polation” end
  • 8. # Clarifying comments are not # reminder notes # FIXME high priority for next $ rake notes deploy (in /home/foobar/commandsapp) def process app/controllers/admin/users_controller.rb: raise “n”   * [ 20] [TODO] any other way to do this? end   * [132] [FIXME] high priority for next deploy # OPTIMIZE refactor this code to   get more done app/model/person.rb: def goodnight   * [ 13] [OPTIMIZE] refactor this code to get sleep 6.hours more done end # TODO any other way to do this? def process(str=’inter’) “use “ + str + ”polation” end
  • 9. # The attention of the comment # is outside the scope # of the accompanying code # used by rake for task management # TODO any other way to do this? def process(str=’inter’) “use “ + str + ”polation” end # used by yard # Converts the object into textual markup given a specific format. # # @param [Symbol] format the format type, `:text` or `:html` # @return [String] the object converted into the expected format. def to_format(format = :html) # format the object end # used by courts # Copyright (C) 2012 by Nate Davis Olds. All rights reserved. # Released under the terms of the GNU General Public License version 2 or later.
  • 10. # A clarifying comment’s attention is # directed internally # inserts a string between two other strings def process(str=’inter’) “use “ + str + ”polation” end
  • 11. # Clarifying comments are # explanations # of the code that follows. # inserts a string between two other strings def process(str=’inter’) “use “ + str + ”polation” end
  • 12. # Clarifying comments are # redundant # of the code that follows. # inserts string def insert_string(str=’inter’) “use “ + str + ”polation” end
  • 13. # Clarifying comments are # apologizes # of the code that follows. # This code sucks! I know it. You know it. # I am sorry that you have to read it. def is_this_example_good 100.times { ”No! it sucks!” } end # I’m drunk. def string_theory_patterns ... end
  • 14. # Clarifying comments are # rants # of the code that follows. # At this point, I'd like to take a moment to speak to you about the Adobe PSD # format. PSD is not a good format. PSD is not even a bad format. Calling it # such would be an insult to other bad formats, such as PCX or JPEG. No, PSD # is an abysmal format. Having worked on this code for several weeks now, my # hate for PSD has grown to a raging fire that burns with the fierce passion # of a million suns. # ..... # Earlier, I tried to get a hold of the latest specs for the PSD file format. # To do this, I had to apply to them for permission to apply to them to have # them consider sending me this sacred tome. This would have involved faxing # them a copy of some document or other, probably signed in blood. I can only # imagine that they make this process so difficult because they are intensely # ashamed of having created this abomination. I was naturally not gullible # enough to go through with this procedure, but if I had done so, I would have # printed out every single page of the spec, and set them all on fire. Were it # within my power, I would gather every single copy of those specs, and launch # them on a spaceship directly into the sun. # # PSD is not my favourite file format.
  • 15. # Clarifying comments are # open letters # of the code that follows. # 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 #
  • 16. # Clarifying comments are # warnings # of the code that follows. # After you run this code, take the day off. # It won’t finish until tomorrow. def im_compiling(stop_at=14.hours.from_now) if stop_at < Time.zone.now puts "done." else print "." sleep 10 im_compiling stop_at end end
  • 17. # Clarifying comments are # dialogs # of the coder that follows. # This is brilliant! # Thanks. It’s nap time. def im_compiling(stop_at=14.hours.from_now) if stop_at < Time.zone.now puts "done." else print "." sleep 10 im_compiling stop_at end end
  • 18. # Clarifying comments are # inside jokes # of the code that follows. stop() # hammertime
  • 19. # Clarifying comments are # misleading descriptions # of the code that follows. # Returns the standard utility allowance # based on how many utilities someone pays. def standard_utility_allowance 324 end
  • 20. # Clarifying comments are # stashed code def standard_utility_allowance # of the code that follows. 324 # Uncomment this by March 3, 2012 when estimations switch back # # case @answers[:utility_allowance] # # when 'Pays for Heating or # Cooling or receives MEAP or EUSP' # 394.0 # # when "Doesn't pay for heating or cooling but pays two other utilities" # 239.0 # # when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)" # @answers[:actual_utility_cost] # # when "Pays telephone only" # 40.0 # # else # 0.0 # end end
  • 21. # Clarifying comments are # deserted code # of the code that follows. def standard_utility_allowance case @answers[:utility_allowance] when 'Pays for Heating or # Cooling or receives MEAP or EUSP' 394.0 # when "Doesn't pay for heating or cooling but pays two other utilities" # 239.0 when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)" @answers[:actual_utility_cost] when "Pays telephone only" 40.0 else 0.0 end end
  • 22. # Why should clarifying comments be removed?
  • 23. # Why should clarifying comments be removed? # Clarifying comments are codejunk
  • 24. # Why should clarifying comments be removed? # Clarifying comments are codejunk term from Katrina Owen # talk entitled Therapeutic Refactoring on confreaks from Cascadia Ruby Conference
  • 25. # Why should clarifying comments be removed? # Clarifying comments are codejunk term from Katrina Owen # talk entitled Therapeutic Refactoring on confreaks from Cascadia Ruby Conference codejunk is a play from Edward Tufté term chartjunk 1 1 Tufte, Edward R. (1983). The Visual Display of Quantitative Information. Cheshire, CT: Graphics Press.
  • 26. Chartjunk refers to all visual elements in charts and graphs that are not necessary to comprehend the information represented on the graph, or that distract the viewer from this information.
  • 27. Codejunk refers to all visual elements in code that are not necessary to comprehend the information represented in the code, or that distract the viewer from this information.
  • 28. Understanding Code 70% New Code 5% Modifying Existing Code 25% # http://blogs.msdn.com/b/peterhal/archive/2006/01/04/509302.aspx Peter Hallam
  • 29. # Why should clarifying comments be removed?
  • 30. # Why should clarifying comments be removed? Because we spend most of our time reading and understanding code
  • 31. # Isn’t that why we write clarifying comments?
  • 32. # Isn’t that why we write clarifying comments? No. We write clarifying comments because our code isn’t clear enough.
  • 33. The use of a clarifying comment admits the failure to write readable, clean code
  • 34. The use of a clarifying comment admits the failure to write readable, clean code # Stop clarifying code with comments; # Write code clearly instead.
  • 36. # explanations # inserts a string between two other strings def process(str=’inter’) “use “ + str + ”polation” end
  • 37. # explanations # inserts a string between two other strings def process(str=’inter’) “use “ + str + ”polation” end # rename function def insert_string(str=’inter’) “use “ + str + ”polation” end
  • 39. # redundant comment # inserts string def insert_string(str=’inter’) “use “ + str + ”polation” end
  • 40. # redundant comment # inserts string def insert_string(str=’inter’) “use “ + str + ”polation” end # without comment def insert_string(str=’inter’) “use “ + str + ”polation” end
  • 42. # apologizing # This code sucks! I know it. You know it. # I am sorry that you have to read it. def is_this_example_good 100.times { ”No! it sucks!” } end
  • 43. # apologizing # This code sucks! I know it. You know it. # I am sorry that you have to read it. def is_this_example_good 100.times { ”No! it sucks!” } end # make it better def is_this_example_good 1000.times { ”Awesome” } end
  • 45. # rants # At this point, I'd like to take a moment to speak to you about the Adobe PSD # format. PSD is not a good format. PSD is not even a bad format. Calling it # such would be an insult to other bad formats, such as PCX or JPEG. No, PSD
  • 46. # rants # At this point, I'd like to take a moment to speak to you about the Adobe PSD # format. PSD is not a good format. PSD is not even a bad format. Calling it # such would be an insult to other bad formats, such as PCX or JPEG. No, PSD # blog about it. tweet it. Or give a presentation about it. Just Remove it from code. Why I hate Adobe PSD format! by I. Rant At this point, I'd like to take a moment to speak to you about the Adobe PSD format. PSD is not a good format. PSD is not even a bad format. Calling it such would be an insult to other bad formats, such as PCX or JPEG. No, PSD
  • 48. # Open letters # 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 #
  • 49. # Open letters # 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 # # Schedule a fix. State the problem. # OPTIMIZE: or refactor. The problem is....
  • 51. # warnings # After you run this code, take the day off. # It won’t finish until tomorrow. def im_compiling(stop_at=14.hours.from_now) if stop_at < Time.zone.now puts "done." else print "." sleep 10 im_compiling stop_at end end
  • 52. # warnings # if it is meant to run long, warn at runtime def im_compiling(stop_at=nil) if stop_at.nil? print “This will take 14 hours. Proceed? (y/n):” should_continue = STDIN.gets.chomp if should_continue == “y” im_compiling 14.hours.from_now end elsif stop_at < Time.zone.now puts "done." else print "." sleep 10 im_compiling stop_at end end
  • 53. # warnings # schedule optimization # OPTIMIZE: remove the n+1 database calls def comment_summaries_for_everyone summaries = [] Person.all.each do |person| person.posts.each do |post| post.comments.each do |comment| summaries << “#{comment.author_name}: #{comment.body}” end end end summaries end
  • 54. # dialogs # This is brilliant! # Thanks. It’s nap time.
  • 55. # dialogs # This is brilliant! # Thanks. It’s nap time. # email. chat. twitter. phone. how about talk?!?
  • 57. # jokes stop() # hammertime
  • 58. # jokes stop() # hammertime # funny the first time, but does it need to be checked in? Delete it stop()
  • 60. # misleading descriptions # Returns the standard utility allowance # based on how many utilities someone pays. def standard_utility_allowance 324 end
  • 61. # misleading descriptions # Returns the standard utility allowance # based on how many utilities someone pays. def standard_utility_allowance 324 end # Remove it or investigate what is correct. def standard_utility_allowance 324 end
  • 62. # stashed code def standard_utility_allowance 324 # Uncomment this by March 3, 2012 when estimations switch back # # case @answers[:utility_allowance] # # when 'Pays for Heating or # Cooling or receives MEAP or EUSP' # 394.0 # # when "Doesn't pay for heating or cooling but pays two other utilities" # 239.0 # # when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)" # @answers[:actual_utility_cost] # # when "Pays telephone only" # 40.0 # # else # 0.0 # end end
  • 63. # stashed code # write it inline, set a note to clean it up # FIXME: After March 3, 2012 def standard_utility_allowance if after_march_3_2012? case @answers[:utility_allowance] when 'Pays for Heating or # Cooling or receives MEAP or EUSP' 394.0 when "Doesn't pay for heating or cooling but pays two other utilities" 239.0 when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)" @answers[:actual_utility_cost] when "Pays telephone only" 40.0 else 0.0 end else 326 end end def after_march_3_2012? Time.zone.now >= Time.new(2012, 3, 3) end
  • 64. # deserted code def standard_utility_allowance case @answers[:utility_allowance] when 'Pays for Heating or # Cooling or receives MEAP or EUSP' 394.0 # when "Doesn't pay for heating or cooling but pays two other utilities" # 239.0 when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)" @answers[:actual_utility_cost] when "Pays telephone only" 40.0 else 0.0 end end
  • 65. # deserted code # remove it. If it passes tests without the code, it is not needed. def standard_utility_allowance case @answers[:utility_allowance] when 'Pays for Heating or # Cooling or receives MEAP or EUSP' 394.0 when "Doesn't pay for heating or cooling but pays one utility bill (NOT telephone)" @answers[:actual_utility_cost] when "Pays telephone only" 40.0 else 0.0 end end
  • 66. A more complex example
  • 67.
  • 68.
  • 69. # Stop clarifying code with comments; # Write code clearly instead.
  • 70. # Questions? # References Therapeutic Refactoring, Katrina Owen http://confreaks.com/videos/1071-cascadiaruby2012-therapeutic-refactoring Chartjunk http://en.wikipedia.org/wiki/Chartjunk#cite_note-tufte-0 What Do Programmers Really Do Anyway? (aka Part 2 of the Yardstick saga), Peter Hallam http://blogs.msdn.com/b/peterhal/archive/2006/01/04/509302.aspx Clean Code, Robert Martin # My Info Nate Davis Olds #natedavisolds Benefits Data Trust lead developer nate@davisolds.com ndavisolds@bdtrust.org www.bdtrust.org

Editor's Notes

  1. \n
  2. \n
  3. RDOC\n\n
  4. YARD\n
  5. \n
  6. - When you become aware of something that needs to be done; just not now\n- Worse than clarifying code if there is no process to return to these problem areas.\n- Acknowledge a problem, stashes it for later fixing, and prevents sidetracks\n\n
  7. In all of these examples, the attention of the comment is outside the scope of the accompanying source code; \n\nin contrast...\n\n\n
  8. in contrast, clarifying comment&amp;#x2019;s attention is directed internally\n\nPOINTS TOWARD THE CODE\n\n\n
  9. EXPLANATIONS\n\n
  10. REDUNDANT\n\n\n\n
  11. REDUNDANT\n\n\n\n
  12. REDUNDANT\n\n\n\n
  13. REDUNDANT\n\n\n\n
  14. REDUNDANT\n\n\n\n
  15. REDUNDANT\n\n\n\n
  16. JOKES\n\n\n\n
  17. REDUNDANT\n\n\n\n
  18. REDUNDANT\n\n\n\n
  19. REDUNDANT\n\n\n\n
  20. I first heard this\n\n\n\n
  21. I first heard this\n\n\n\n
  22. I first heard this\n\n\n\n
  23. I first heard this\n\n\n\n
  24. DESERTED CODE\n\n\n\n
  25. DESERTED CODE\n\n\n\n
  26. Peter Hallam asserts that coders spend more time reading code than writing code; a lot more.\n\n\n\n
  27. DESERTED CODE\n\n\n\n
  28. DESERTED CODE\n\n\n\n
  29. DESERTED CODE\n\n\n\n
  30. DESERTED CODE\n\n\n\n
  31. EXPLANATIONS\n\n
  32. EXPLANATIONS\n\n
  33. EXPLANATIONS\n\n
  34. REDUNDANT\n\n\n\n
  35. REDUNDANT\n\n\n\n
  36. REDUNDANT\n\n\n\n
  37. REDUNDANT\n\n\n\n
  38. REDUNDANT\n\n\n\n
  39. REDUNDANT\n\n\n\n
  40. REDUNDANT\n\n\n\n
  41. REDUNDANT\n\n\n\n
  42. REDUNDANT\n\n\n\n
  43. REDUNDANT\n\n\n\n
  44. REDUNDANT\n\n\n\n
  45. REDUNDANT\n\n\n\n
  46. REDUNDANT\n\n\n\n
  47. REDUNDANT\n\n\n\n
  48. REDUNDANT\n\n\n\n
  49. REDUNDANT\n\n\n\n
  50. REDUNDANT\n\n\n\n
  51. dialogs\nmake sure they get it\n\n\n\n
  52. JOKES\n\n\n\n
  53. JOKES\n\n\n\n
  54. JOKES\n\n\n\n
  55. REDUNDANT\n\n\n\n
  56. REDUNDANT\n\n\n\n
  57. REDUNDANT\n\n\n\n
  58. REDUNDANT\n\n\n\n
  59. This makes sure that it works correctly on time and also scheduled to clean it up.\n\n\n\n
  60. REDUNDANT\n\n\n\n
  61. REDUNDANT\n\n\n\n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n