SlideShare una empresa de Scribd logo
1 de 113
Descargar para leer sin conexión
Refactoring
                           { :from => :mess,
                               :to => :clean_code,
                                 :through => :patterns }



                                                                @caike
  Orlando Ruby User Group                        http://caikesouza.com
  January 2010
Friday, January 15, 2010
Agile


Friday, January 15, 2010
Testing


Friday, January 15, 2010
Patterns


Friday, January 15, 2010
Professionalism


Friday, January 15, 2010
Software Craftsmanship


Friday, January 15, 2010
?
Friday, January 15, 2010
http://www.flickr.com/photos/eurleif/255241547/




Friday, January 15, 2010
"Any fool can write code that
         a computer can understand.
      Good programmers write code that
          humans can understand"
               (Martin Fowler)



Friday, January 15, 2010
“Free software only matters
                             to those who can read”
                              (Robert M. Lefkowitz)



Friday, January 15, 2010
Friday, January 15, 2010
http://www.flickr.com/photos/dhammza/91435718/




Friday, January 15, 2010
Given messy code that works
          When I refactor
Then it should be easier to understand
           And still work!



Friday, January 15, 2010
Cleaning up the house



Friday, January 15, 2010
http://www.flickr.com/photos/benfrantzdale/208672143/




                                                            http://www.flickr.com/photos/improveit/1574023621/




Friday, January 15, 2010
wiki, Fit, JUnit




     http://www.flickr.com/photos/benfrantzdale/208672143/




                  eXtreme
                Programming
                                                               http://www.flickr.com/photos/improveit/1574023621/




Friday, January 15, 2010
Friday, January 15, 2010
http://www.flickr.com/photos/adewale_oshineye/2933030620




Friday, January 15, 2010
Some reasons...


Friday, January 15, 2010
Design++


Friday, January 15, 2010
Money++


Friday, January 15, 2010
Respond to changes
                        Money++


Friday, January 15, 2010
Respond to changes
           Money++
    Release with confidence

Friday, January 15, 2010
Effort--


Friday, January 15, 2010
Waterfall




                           Jan   Feb   Mar    Apr     May     Jun           Jul

                                        Cost of Maintenance         Extreme Programming Explained: Embrace Change
                                                                                Addison Wesley, 2000




Friday, January 15, 2010
XP




                           Jan   Feb   Mar    Apr     May     Jun           Jul

                                        Cost of Maintenance         Extreme Programming Explained: Embrace Change
                                                                                Addison Wesley, 2000




Friday, January 15, 2010
code LESS
                                                  sleep MORE
    http://www.flickr.com/photos/x180/503574487/




Friday, January 15, 2010
http://www.flickr.com/photos/rockinrob/1485573200/




Friday, January 15, 2010
When ?


Friday, January 15, 2010
When you add a function


Friday, January 15, 2010
When you fix a bug


Friday, January 15, 2010
Code Reviews


Friday, January 15, 2010
http://www.flickr.com/photos/highwayoflife/2699887178/




Friday, January 15, 2010
Code Smells


Friday, January 15, 2010
Duplicated Code

                           Code Smells


Friday, January 15, 2010
Duplicated Code

                           Code Smells
                                 Long Method


Friday, January 15, 2010
Duplicated Code
     Large Class
                           Code Smells
                                 Long Method


Friday, January 15, 2010
Duplicated Code
     Large Class      Divergent Change
                           Code Smells
                                 Long Method


Friday, January 15, 2010
Duplicated Code
     Large Class      Divergent Change
                           Code Smells
       Long Parameter
             List                Long Method


Friday, January 15, 2010
Test Driven
                           Development


Friday, January 15, 2010
Red
                            Green
                           Refactor

Friday, January 15, 2010
What if I Don’t ?


Friday, January 15, 2010
Debt Metaphor


Friday, January 15, 2010
http://www.flickr.com/photos/benfrantzdale/208672143/




Friday, January 15, 2010
http://www.flickr.com/photos/didmyself/3050138294/




Friday, January 15, 2010
Get ready for code!


Friday, January 15, 2010
managers = []

                         employees.each do |e|
                           managers << e if e.is_manager?
                         end




Saturday, January 16, 2010
managers = []

                         employees.each do |e|
                           managers << e if e.is_manager?
                         end




Saturday, January 16, 2010
Replace Loop with
                              Closure Method




Saturday, January 16, 2010
managers = []

                         employees.each do |e|
                           managers << e if e.is_manager?
                         end




Saturday, January 16, 2010
managers = employees.
                        select { |e| e.is_manager? }




Saturday, January 16, 2010
class Movie
                          def initialize(stars)
                            @stars = stars
                          end

                          def recommended?
                            ((@stars > 5) ? 8 : 1) >= 8
                          end
                        end




Saturday, January 16, 2010
http://www.flickr.com/photos/anirudhkoul/3804552280/




Saturday, January 16, 2010
http://www.bartcop.com/marilyn-monroe001.jpg




Saturday, January 16, 2010
http://thetorchonline.com/wp-content/uploads/2009/04/deathstar.jpg




Saturday, January 16, 2010
class Movie
                          def initialize(stars)
                            @stars = stars
                          end

                          def recommended?
                            ((@stars > 5) ? 8 : 1) >= 8
                          end
                        end




Saturday, January 16, 2010
Introduce Explaining
                                   Variable




Saturday, January 16, 2010
class Movie
                          def initialize(stars)
                            @stars = stars
                          end

                          def recommended?
                            ((@stars > 5) ? 8 : 1) >= 8
                          end
                        end




Saturday, January 16, 2010
class Movie
                          def initialize(stars)
                            @stars = stars
                          end

                          def recommended?
                            rating = (@stars > 5) ? 8 : 1
                            rating >= 8
                          end
                        end



Saturday, January 16, 2010
class Movie
                          def initialize(stars)
                            @stars = stars
                          end

                          def recommended?
                            rating = (@stars > 5) ? 8 : 1
                            rating >= 8
                          end
                        end



Saturday, January 16, 2010
Replace Temp
                             With Query




Saturday, January 16, 2010
class Movie
                          def initialize(stars)
                            @stars = stars
                          end

                          def recommended?
                            rating = (@stars > 5) ? 8 : 1
                            rating >= 8
                          end
                        end



Saturday, January 16, 2010
class Movie
                          def initialize(stars)
                            @stars = stars
                          end

                             def recommended?
                               rating >= 8
                             end

                          def rating
                            (@stars > 5) ? 8 : 1
                          end
                        end
Saturday, January 16, 2010
OMG,
                             This is sooooo cooooool!




Saturday, January 16, 2010
class Movie

                             def recommended?
                               rating >= 8
                             end

                          def rating
                            (@stars > 5) ? 8 : 1
                          end
                        end




Saturday, January 16, 2010
class Movie

                             def recommended?
                               rating >= 8
                             end

                             def rating
                               more_than_five_stars? ? 8 : 1
                             end

                          def more_than_five_stars?
                            @stars > 5
                          end
                        end
Saturday, January 16, 2010
Inline Method




Saturday, January 16, 2010
class Movie
                          def initialize...end
                          def recommended?
                            rating >= 8
                          end

                             def rating
                               more_than_five_stars? ? 8 : 1
                             end

                          def more_than_five_stars?
                            @stars > 5
                          end
                        end
Saturday, January 16, 2010
class Movie
                          def initialize...end
                          def recommended?
                            rating >= 8
                          end

                             def rating
                               @stars > 5 ? 8 : 1
                             end




                        end
Saturday, January 16, 2010
mock = mock('user')
                       expectation = mock.expects(:find)
                       expectation.with("1")
                       expectation.returns([])




Saturday, January 16, 2010
mock = mock('user')
                       expectation = mock.expects(:find)
                       expectation.with("1")
                       expectation.returns([])




Saturday, January 16, 2010
Replace Temp
                              With Chain




Saturday, January 16, 2010
mock = mock('user')
                       expectation = mock.expects(:find)
                       expectation.with("1")
                       expectation.returns([])




Saturday, January 16, 2010
mock = mock('user')
                       mock.expects(:find).with("1").
                             returns([])




Saturday, January 16, 2010
def expects
                               ...
                               self
                             end

                             def with
                               ...
                               self
                             end

                             def returns
                               ...
                               self
                             end

Saturday, January 16, 2010
def charge(amount, ccnumber)
           begin
             conn = CC_Charger_Server.connect(...)
             conn.send(amount, ccnumber)
           rescue IOError => e
             Logger.log "Error: #{e}"
             return nil
           ensure
             conn.close
           end
         end



Saturday, January 16, 2010
def charge(amount, ccnumber)
           begin
             conn = CC_Charger_Server.connect(...)
             conn.send(amount, ccnumber)
           rescue IOError => e
             Logger.log "Error: #{e}"
             return nil
           ensure
             conn.close
           end
         end



Saturday, January 16, 2010
Extract Surrounding
                                   Method




Saturday, January 16, 2010
def charge(amount, ccnumber)
           begin
             conn = CC_Charger_Server.connect(...)
             conn.send(amount, ccnumber)
           rescue IOError => e
             Logger.log "Error: #{e}"
             return nil
           ensure
             conn.close
           end
         end



Saturday, January 16, 2010
def charge(amount, ccnumber)
                  connect do |conn|
                    conn.send(amount, ccnumber)
                  end
                end




Saturday, January 16, 2010
def connect
           begin
             conn = CC_Charger_Server.connect(...)
             yield conn
           rescue IOError => e
             Logger.log "Error: #{e}"
             return nil
           ensure
             conn.close
           end
         end



Saturday, January 16, 2010
def body_fat_percentage(name,
        age, height, weight, metric_system)
        ...
      end




Saturday, January 16, 2010
body_fat_percentage("fred", 30, 1.82, 90, 1)
    body_fat_percentage("joe", 32, 6, 220, 2)




Saturday, January 16, 2010
body_fat_percentage("fred", 30, 1.82, 90, 1)
    body_fat_percentage("joe", 32, 6, 220, 2)




Saturday, January 16, 2010
Introduce Named Parameter




Saturday, January 16, 2010
def body_fat_percentage(name,
        age, height, weight, metric_system)
        ...
      end




Saturday, January 16, 2010
def            body_fat_percentage(name, params={})
        #            params[:age]
        #            params[:height]
        #            params[:weight]
        #            params[:metric_system]
      end




Saturday, January 16, 2010
body_fat_percentage("fred", 30, 1.82, 90, 1)
    body_fat_percentage("joe", 32, 6, 220, 2)




Saturday, January 16, 2010
body_fat_percentage("fred", :age => 30,
              :height => 1.82, :weight => 90,
              MetricSystem::METERS_KG)

            body_fat_percentage("joe", :age => 32,
              :height => 6, :weight => 220,
              MetricSystem::FEET_LB)




Saturday, January 16, 2010
user.posts.paginate(:page => params[:page],
      :per_page => params[:per_page] || 15)




Saturday, January 16, 2010
user.posts.paginate(:page => params[:page],
      :per_page => params[:per_page] || 15)




Saturday, January 16, 2010
Replace Magic Number
                             with Symbolic Constant




Saturday, January 16, 2010
user.posts.paginate(:page => params[:page],
      :per_page => params[:per_page] || 15)




Saturday, January 16, 2010
CONTACTS_PER_PAGE = 15

  user.posts.paginate(:page => params[:page],
      :per_page => params[:per_page] ||
  CONTACTS_PER_PAGE)




Saturday, January 16, 2010
class MountainBike
               def price
                 ...
               end
             end

             MountainBike.new(:type => :rigid, ...)
             MountainBike.new(:type => :front_suspension, ...)
             MountainBike.new(:type => :full_suspension, ...)




Saturday, January 16, 2010
def price
                               if @type_code == :rigid
                                   (1 + @comission) * @base_price
                               end
                               if @type_code == :font_suspension
                                 (1 + @comission) * @base_price +
                                 @front_suspension_price
                               end
                               if @type_code == :full_suspension
                                 (1 + @comission) * @base_price+
                                 @front_suspension_price +
                                 @rear_suspension_price
                               end




                             end
Saturday, January 16, 2010
def price
                               if @type_code == :rigid
                                   (1 + @comission) * @base_price
                               end
                               if @type_code == :font_suspension
                                 (1 + @comission) * @base_price +
                                 @front_suspension_price
                               end
                               if @type_code == :full_suspension
                                 (1 + @comission) * @base_price+
                                 @front_suspension_price +
                                 @rear_suspension_price
                               end
                               if @type_code == :ultra_suspension
                                   ...
                               end
                             end
Saturday, January 16, 2010
Saturday, January 16, 2010
Replace Conditional
                             With Polymorphism




Saturday, January 16, 2010
class MountainBike
                      def price
                        ...
                      end
                    end




Saturday, January 16, 2010
module MountainBike
                      def price
                        ...
                      end
                    end




Saturday, January 16, 2010
class RigidMountainBike
                      include MountainBike
                    end

                    class FrontSuspensionMountainBike
                      include MountainBike
                    end

                    class FullSuspensionMountainBike
                      include MountainBike
                    end




Saturday, January 16, 2010
RigidMountainBike.new(:type => :rigid, ...)

             FrontSuspensionMountainBike.new(:type =>
             :front_suspension, ...)

             FullSuspensionMountainBike.new(:type =>
              :full_suspension, ...)




Saturday, January 16, 2010
class RigidMountainBike
                      include MountainBike

                      def price
                        (1 + @comission) * @base_price
                      end
                    end




Saturday, January 16, 2010
def price
                               if @type_code == :rigid
                                 raise "should not be called"
                               end
                               if @type_code == :font_suspension
                                 (1 + @comission) * @base_price +
                                 @front_suspension_price
                               end
                               if @type_code == :full_suspension
                                 (1 + @comission) * @base_price+
                                 @front_suspension_price +
                                 @rear_suspension_price
                               end
                             end

Saturday, January 16, 2010
class FrontSuspensionMountainBike
                      include MountainBike
                      def price
                        (1 + @comission) * @base_price +
                        @front_suspension_price
                      end
                    end

                    class FullSuspensionMountainBike
                      include MountainBike
                      def price
                        (1 + @comission) * @base_price +
                        @front_suspension_price +
                        @rear_suspension_price
                      end
                    end

Saturday, January 16, 2010
def price
                               if @type_code == :rigid
                                 raise "should not be called"
                               end
                               if @type_code == :font_suspension
                                 raise "should not be called"
                               end
                               if @type_code == :full_suspension
                                 raise "should not be called"
                               end
                             end



Saturday, January 16, 2010
def price
                               if @type_code == :rigid
                                 raise "should not be called"
                               end
                               if @type_code == :font_suspension
                                 raise "should not be called"
                               end
                               if @type_code == :full_suspension
                                 raise "should not be called"
                               end
                             end



Saturday, January 16, 2010
class RigidMountainBike
                      include MountainBike
                    end

                    class FrontSuspensionMountainBike
                      include MountainBike
                    end

                    class FullSuspensionMountainBike
                      include MountainBike
                    end




Saturday, January 16, 2010
Only the beginning...
Saturday, January 16, 2010
Coding Dojo



                                       http://www.flickr.com/photos/el_ser_lomo/3267627038/




                                  http://orlandodojo.wordpress.com/
                             http://groups.google.com/group/orlando-dojo/
Saturday, January 16, 2010
Saturday, January 16, 2010
Thank you!
                                                   @caike
                                    http://caikesouza.com

Saturday, January 16, 2010

Más contenido relacionado

Destacado

RailsWayCon 2010 Coding Dojo
RailsWayCon 2010 Coding DojoRailsWayCon 2010 Coding Dojo
RailsWayCon 2010 Coding DojoMichael Mahlberg
 
Agile tour 2014 - Coding Dojo with C# and TDD
Agile tour 2014 - Coding Dojo with C# and TDDAgile tour 2014 - Coding Dojo with C# and TDD
Agile tour 2014 - Coding Dojo with C# and TDDAgileCommunity
 
Coding dojo
Coding dojoCoding dojo
Coding dojovietnt84
 
Coding Dojo: Data Munging (2016)
Coding Dojo: Data Munging (2016)Coding Dojo: Data Munging (2016)
Coding Dojo: Data Munging (2016)Peter Kofler
 
XpUg Coding Dojo: KataYahtzee in Ocp way
XpUg Coding Dojo: KataYahtzee in Ocp wayXpUg Coding Dojo: KataYahtzee in Ocp way
XpUg Coding Dojo: KataYahtzee in Ocp wayGiordano Scalzo
 
Construindo um Servidor Web com GO
Construindo um Servidor Web com GOConstruindo um Servidor Web com GO
Construindo um Servidor Web com GOBeto Muniz
 
Coding dojo C# com NUnit
Coding dojo C# com NUnitCoding dojo C# com NUnit
Coding dojo C# com NUnitFabricio Panhan
 
InCuca - Coding dojo - AngularJS
InCuca - Coding dojo - AngularJSInCuca - Coding dojo - AngularJS
InCuca - Coding dojo - AngularJSInCuca
 
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)Peter Kofler
 
TDD Dojo - Test Driven Development Coding Dojo
TDD Dojo - Test Driven Development Coding DojoTDD Dojo - Test Driven Development Coding Dojo
TDD Dojo - Test Driven Development Coding DojoRoberto Bettazzoni
 
Teaching and Learning TDD in the Coding Dojo
Teaching and Learning TDD in the Coding DojoTeaching and Learning TDD in the Coding Dojo
Teaching and Learning TDD in the Coding DojoEmily Bache
 
#safaDojo - Coding Dojo Go lang
#safaDojo - Coding Dojo Go lang#safaDojo - Coding Dojo Go lang
#safaDojo - Coding Dojo Go langMarcelo Andrade
 

Destacado (14)

Kiev Coding Dojo
Kiev Coding DojoKiev Coding Dojo
Kiev Coding Dojo
 
RailsWayCon 2010 Coding Dojo
RailsWayCon 2010 Coding DojoRailsWayCon 2010 Coding Dojo
RailsWayCon 2010 Coding Dojo
 
Agile tour 2014 - Coding Dojo with C# and TDD
Agile tour 2014 - Coding Dojo with C# and TDDAgile tour 2014 - Coding Dojo with C# and TDD
Agile tour 2014 - Coding Dojo with C# and TDD
 
Coding dojo
Coding dojoCoding dojo
Coding dojo
 
Coding Dojo: Data Munging (2016)
Coding Dojo: Data Munging (2016)Coding Dojo: Data Munging (2016)
Coding Dojo: Data Munging (2016)
 
XpUg Coding Dojo: KataYahtzee in Ocp way
XpUg Coding Dojo: KataYahtzee in Ocp wayXpUg Coding Dojo: KataYahtzee in Ocp way
XpUg Coding Dojo: KataYahtzee in Ocp way
 
Construindo um Servidor Web com GO
Construindo um Servidor Web com GOConstruindo um Servidor Web com GO
Construindo um Servidor Web com GO
 
Coding Dojo
Coding DojoCoding Dojo
Coding Dojo
 
Coding dojo C# com NUnit
Coding dojo C# com NUnitCoding dojo C# com NUnit
Coding dojo C# com NUnit
 
InCuca - Coding dojo - AngularJS
InCuca - Coding dojo - AngularJSInCuca - Coding dojo - AngularJS
InCuca - Coding dojo - AngularJS
 
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
 
TDD Dojo - Test Driven Development Coding Dojo
TDD Dojo - Test Driven Development Coding DojoTDD Dojo - Test Driven Development Coding Dojo
TDD Dojo - Test Driven Development Coding Dojo
 
Teaching and Learning TDD in the Coding Dojo
Teaching and Learning TDD in the Coding DojoTeaching and Learning TDD in the Coding Dojo
Teaching and Learning TDD in the Coding Dojo
 
#safaDojo - Coding Dojo Go lang
#safaDojo - Coding Dojo Go lang#safaDojo - Coding Dojo Go lang
#safaDojo - Coding Dojo Go lang
 

Similar a Refactoring

The Art of the Spike
The Art of the SpikeThe Art of the Spike
The Art of the SpikeAaron Bedra
 
Elretodelanube conclusiones
Elretodelanube conclusionesElretodelanube conclusiones
Elretodelanube conclusionessalesatocha
 
Marhmallow game presentation
Marhmallow game presentationMarhmallow game presentation
Marhmallow game presentation연 허
 
The Marshmellow challenge - esercizio di teambuilding
The Marshmellow challenge - esercizio di teambuildingThe Marshmellow challenge - esercizio di teambuilding
The Marshmellow challenge - esercizio di teambuildingIrene Morrione
 
使用 PandaForm.com 製作及管理網上表格
使用 PandaForm.com 製作及管理網上表格使用 PandaForm.com 製作及管理網上表格
使用 PandaForm.com 製作及管理網上表格Daniel Cheng
 
Please Don't Touch the Slow Parts V2
Please Don't Touch the Slow Parts V2Please Don't Touch the Slow Parts V2
Please Don't Touch the Slow Parts V2Federico Galassi
 
Mobile JavaScript Development - QCon 2010
Mobile JavaScript Development - QCon 2010Mobile JavaScript Development - QCon 2010
Mobile JavaScript Development - QCon 2010Nikolai Onken
 
The Limited Red Society
The Limited Red SocietyThe Limited Red Society
The Limited Red SocietyNaresh Jain
 
Layar event US introduction and cases
Layar event US introduction and casesLayar event US introduction and cases
Layar event US introduction and casesLayar
 
Simple Steps to Great Web Design
Simple Steps to Great Web DesignSimple Steps to Great Web Design
Simple Steps to Great Web DesignMatthew Smith
 
Social Media For Museums
Social Media For MuseumsSocial Media For Museums
Social Media For Museumsmichellej
 
The Future of Technology
The Future of TechnologyThe Future of Technology
The Future of TechnologyDavid Bill
 
Cutting Edge CSS3 @ WebExpo Tour 2010
Cutting Edge CSS3 @ WebExpo Tour 2010Cutting Edge CSS3 @ WebExpo Tour 2010
Cutting Edge CSS3 @ WebExpo Tour 2010Zi Bin Cheah
 
The IT Philharmonic - OSCON 2010
The IT Philharmonic - OSCON 2010 The IT Philharmonic - OSCON 2010
The IT Philharmonic - OSCON 2010 Chef Software, Inc.
 
Dinámica: Reto de la nube. Charo Fernández.
Dinámica: Reto de la nube. Charo Fernández. Dinámica: Reto de la nube. Charo Fernández.
Dinámica: Reto de la nube. Charo Fernández. cita fgsr
 
History of CHI
History of CHIHistory of CHI
History of CHIErik Duval
 
Summer of Tech Careers Seminar 2010
Summer of Tech Careers Seminar 2010Summer of Tech Careers Seminar 2010
Summer of Tech Careers Seminar 2010summerofcode
 

Similar a Refactoring (20)

The Art of the Spike
The Art of the SpikeThe Art of the Spike
The Art of the Spike
 
Elretodelanube conclusiones
Elretodelanube conclusionesElretodelanube conclusiones
Elretodelanube conclusiones
 
Marhmallow game presentation
Marhmallow game presentationMarhmallow game presentation
Marhmallow game presentation
 
The Marshmellow challenge - esercizio di teambuilding
The Marshmellow challenge - esercizio di teambuildingThe Marshmellow challenge - esercizio di teambuilding
The Marshmellow challenge - esercizio di teambuilding
 
使用 PandaForm.com 製作及管理網上表格
使用 PandaForm.com 製作及管理網上表格使用 PandaForm.com 製作及管理網上表格
使用 PandaForm.com 製作及管理網上表格
 
Drupal In The Cloud
Drupal In The CloudDrupal In The Cloud
Drupal In The Cloud
 
Please Don't Touch the Slow Parts V2
Please Don't Touch the Slow Parts V2Please Don't Touch the Slow Parts V2
Please Don't Touch the Slow Parts V2
 
Mobile JavaScript Development - QCon 2010
Mobile JavaScript Development - QCon 2010Mobile JavaScript Development - QCon 2010
Mobile JavaScript Development - QCon 2010
 
The Limited Red Society
The Limited Red SocietyThe Limited Red Society
The Limited Red Society
 
Layar event US introduction and cases
Layar event US introduction and casesLayar event US introduction and cases
Layar event US introduction and cases
 
Simple Steps to Great Web Design
Simple Steps to Great Web DesignSimple Steps to Great Web Design
Simple Steps to Great Web Design
 
Social Media For Museums
Social Media For MuseumsSocial Media For Museums
Social Media For Museums
 
The Future of Technology
The Future of TechnologyThe Future of Technology
The Future of Technology
 
Cutting Edge CSS3 @ WebExpo Tour 2010
Cutting Edge CSS3 @ WebExpo Tour 2010Cutting Edge CSS3 @ WebExpo Tour 2010
Cutting Edge CSS3 @ WebExpo Tour 2010
 
The IT Philharmonic - OSCON 2010
The IT Philharmonic - OSCON 2010 The IT Philharmonic - OSCON 2010
The IT Philharmonic - OSCON 2010
 
Dinámica: Reto de la nube. Charo Fernández.
Dinámica: Reto de la nube. Charo Fernández. Dinámica: Reto de la nube. Charo Fernández.
Dinámica: Reto de la nube. Charo Fernández.
 
History of CHI
History of CHIHistory of CHI
History of CHI
 
Summer of Tech Careers Seminar 2010
Summer of Tech Careers Seminar 2010Summer of Tech Careers Seminar 2010
Summer of Tech Careers Seminar 2010
 
Intro to Twitter
Intro to TwitterIntro to Twitter
Intro to Twitter
 
Intro to Twitter
Intro to TwitterIntro to Twitter
Intro to Twitter
 

Último

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
 
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
 
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
 
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
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
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
 
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
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024SynarionITSolutions
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024The Digital Insurer
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 

Último (20)

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
 
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
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
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
 
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
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

Refactoring