$30 off During Our Annual Pro Sale. View Details »

The future of development – Are our jobs gettin...

The future of development – Are our jobs getting harder or easier?

In the early days of computing, software developers had to encode their programs on punch cards, and carry the bits around by hand. By the 1970s they had the joy of keyboards and displays. Sadly, those oppressed developers had to wear flare trousers, work in C, and manage their own memory. By 2000 the memory thing was sorted out, but the trousers were arguably worse, and developers had to maintain their own hardware. Now, our hardware is someone else’s problem, everything is open source, AI can write our code, and we have a choice whether to work in Java, Kotlin, Javascript, Ruby, Go, Python, Rust, or Typescript. On the other hand, now we have yaml. And many of us find we have to work in ALL of Java, Kotlin, Javascript, Ruby, Go, Python, Rust, or Typescript, all while managing a cloud, becoming security experts, learning CSS, and debugging the code our AI “helper” wrote. And we’re supposed to be full-stack, and shifting left, and building up open source in our free time. Are we living the dream or sinking under cognitive overload?

Holly Cummins

October 18, 2024
Tweet

More Decks by Holly Cummins

Other Decks in Programming

Transcript

  1. the future of development are our jobs getting harder or

    easier? Dr Holly Cummins Senior Principal Software Engineer, Quarkus @[email protected] Red Hat Voxxed Days Thessaloniki October 19, 2024
  2. @holly_cummins #RedHat Caused by: java.io.IOException: Invalid Magic at org.jboss.jandex.Indexer.verifyMagic(Indexer.java:2090) at

    org.jboss.jandex.Indexer.indexWithSummary(Indexer.java:2479) at org.jboss.jandex.Indexer.index(Indexer.java:2452 true story
  3. @holly_cummins #RedHat Caused by: java.io.IOException: Invalid Magic at org.jboss.jandex.Indexer.verifyMagic(Indexer.java:2090) at

    org.jboss.jandex.Indexer.indexWithSummary(Indexer.java:2479) at org.jboss.jandex.Indexer.index(Indexer.java:2452 true story Invalid Magic?!
  4. @holly_cummins #RedHat TCF 1/PIPA1 +1 NOOP # LESS THAN ZERO

    IMPOSSIBLE. RELINT # Page 299 IRIGCOMP TS GCOMPSW # INDICATE COMMANDS 2 PULSES OR LESS. TS BUF # INDEX COUNTER - IRIGX, IRIGY, IRIGZ. IRIGX EXTEND DCS DELVX # (PIPA PULSES) X 2(+14) DXCH MPAC CA ADIAX # (GYRO PULSES)/(PIPA PULSE) X 2(-3) * TC GCOMPSUB # -(ADIAX)(PIPAX) (GYRO PULSES) X 2(+14) EXTEND # DCS DELVY # (PIPA PULSES) X 2(+14) DXCH MPAC # CS ADSRAX # (GYRO PULSES)/(PIPA PULSE) X 2(-3) * TC GCOMPSUB # +(ADSRAX)(PIPAY) (GYRO PULSES) X 2(+14) # EXTEND # *** # DCS DELVY # *** (PIPA PULSES) X 2(+14) # DXCH MPAC # *** # CA ADOAX # *** (GYRO PULSES)/(PIPA PULSE) X 2(-3) * # TC GCOMPSUB # *** -(ADOAX)(PIPAZ) (GYRO PULSES) X 2(+14) CS NBDX # (GYRO PULSES)/(CS) X 2(-5) TC DRIFTSUB # -(NBDX)(DELTAT) (GYRO PULSES) X 2(+14) IRIGY EXTEND DCS DELVY # (PIPA PULSES) X 2(+14) DXCH MPAC CA ADIAY # (GYRO PULSES)/(PIPA PULSE) X 2(-3) * TC GCOMPSUB # -(ADIAY)(PIPAY) (GYRO PULSES) X 2(+14) EXTEND DCS DELVZ # (PIPA PULSES) X 2(+14) DXCH MPAC CS ADSRAY # (GYRO PULSES)/(PIPA PULSE) X 2(-3) * TC GCOMPSUB # +(ADSRAY)(PIPAZ) (GYRO PULSES) X 2(+14) # EXTEND # *** # DCS DELVX # *** (PIPA PULSES) X 2(+14) # DXCH MPAC # *** https://github.com/chrislgarry/Apollo-11/blob/master/Comanche055/IMU_COMPENSATION_PACKAGE.agc 1969
  5. transistor networks framework application high-level language assembler machine codes libraries

    our modern stack ai coding assistant 1947 1940s 1956 1947 1990s 1960s 2020s 1843
  6. transistor networks framework application high-level language assembler machine codes libraries

    our modern stack ai coding assistant abstraction 1947 1940s 1956 1947 1990s 1960s 2020s 1843
  7. @holly_cummins #RedHat package com.example; import org.jboss.logging.Logger; public class MyService {

    private static final Logger log = Logger.getLogger(MyService.class); public void doSomething() { log.info("It works!"); } } example: quarkus logging
  8. @holly_cummins #RedHat package com.example; import org.jboss.logging.Logger; public class MyService {

    private static final Logger log = Logger.getLogger(MyService.class); public void doSomething() { log.info("It works!"); } } example: quarkus logging import io.quarkus.logging.Log; Log
  9. @holly_cummins #RedHat if one is not able to write a

    simple code and depends on generated code, then he is not a developer
  10. @holly_cummins #RedHat “Avoid using any language that uses ‘garbage collection’

    memory management. It teaches bad habits and makes for lazy, sloppy engineers.” –anonymous, 2005 “ http://ex-mentis.blogspot.com/2006/05/are-paul-graham-and-joel-spolsky-right.html
  11. @holly_cummins #RedHat “when programmers rely on a GC implementation to

    clean up their mess, they become lazy.” –M., 2006 www.skyos.org/board/viewtopic.php?p=91820&sid=e56df2df37ff899da22c8ace
  12. @holly_cummins #RedHat “Garbage collection encourages lazy programming habits, which I’ve

    seen in quite a few Java developers.” – anonymous, 2006 https://slashdot.org/story/06/08/07/2126253/xcode-update-gives-objective-c-garbage-collection
  13. @holly_cummins #RedHat garbage collection users were more likely to complete

    the task in the time available, and those who did so required only about a third as much time (4 hours vs. 12 hours)
  14. - not true* - irrelevant even if true “higher level

    languages are slower” *mostly *sometimes
  15. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant how does this happen? smart people dig down the stack, so we don’t have to
  16. @holly_cummins #RedHat private static int extractSize(Object it) { if (it

    instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } else if (it.getClass().isArray()) { return Array.getLength(it); } else if (it instanceof Integer) { return ((Integer) it); } return 10; } // Note that we intentionally use "instanceof" to test interfaces as the last resort in order to mitigate the "type pollution” // See https://github.com/RedHatPerf/type-pollution-agent for more information if (it instanceof AbstractCollection) { return ((AbstractCollection<?>) it).size(); } else if (it instanceof AbstractMap) { return ((AbstractMap<?, ?>) it).size(); } else if (it instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } return 10; }
  17. @holly_cummins #RedHat private static int extractSize(Object it) { if (it

    instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } else if (it.getClass().isArray()) { return Array.getLength(it); } else if (it instanceof Integer) { return ((Integer) it); } return 10; } // Note that we intentionally use "instanceof" to test interfaces as the last resort in order to mitigate the "type pollution” // See https://github.com/RedHatPerf/type-pollution-agent for more information if (it instanceof AbstractCollection) { return ((AbstractCollection<?>) it).size(); } else if (it instanceof AbstractMap) { return ((AbstractMap<?, ?>) it).size(); } else if (it instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } return 10; }
  18. @holly_cummins #RedHat private static int extractSize(Object it) { if (it

    instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } else if (it.getClass().isArray()) { return Array.getLength(it); } else if (it instanceof Integer) { return ((Integer) it); } return 10; } // Note that we intentionally use "instanceof" to test interfaces as the last resort in order to mitigate the "type pollution” // See https://github.com/RedHatPerf/type-pollution-agent for more information if (it instanceof AbstractCollection) { return ((AbstractCollection<?>) it).size(); } else if (it instanceof AbstractMap) { return ((AbstractMap<?, ?>) it).size(); } else if (it instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } return 10; } not a fan of the fix
  19. @holly_cummins #RedHat private static int extractSize(Object it) { if (it

    instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } else if (it.getClass().isArray()) { return Array.getLength(it); } else if (it instanceof Integer) { return ((Integer) it); } return 10; } // Note that we intentionally use "instanceof" to test interfaces as the last resort in order to mitigate the "type pollution” // See https://github.com/RedHatPerf/type-pollution-agent for more information if (it instanceof AbstractCollection) { return ((AbstractCollection<?>) it).size(); } else if (it instanceof AbstractMap) { return ((AbstractMap<?, ?>) it).size(); } else if (it instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } return 10; } not a fan of the fix non-idiomatic
  20. @holly_cummins #RedHat private static int extractSize(Object it) { if (it

    instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } else if (it.getClass().isArray()) { return Array.getLength(it); } else if (it instanceof Integer) { return ((Integer) it); } return 10; } // Note that we intentionally use "instanceof" to test interfaces as the last resort in order to mitigate the "type pollution” // See https://github.com/RedHatPerf/type-pollution-agent for more information if (it instanceof AbstractCollection) { return ((AbstractCollection<?>) it).size(); } else if (it instanceof AbstractMap) { return ((AbstractMap<?, ?>) it).size(); } else if (it instanceof Collection) { return ((Collection<?>) it).size(); } else if (it instanceof Map) { return ((Map<?, ?>) it).size(); } return 10; } not a fan of the fix non-idiomatic difficult to maintain
  21. @holly_cummins #RedHat normal, not-weird code is most optimisable by the

    JIT do not try this at home JIT makes things fast
  22. @holly_cummins #RedHat “Any sufficiently complicated C or Fortran program contains

    an ad hoc, informally- specified, bug-ridden, slow implementation of half of Common Lisp." Greenspun's tenth rule of programming
  23. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant cognitive load ai coding assistant machine codes assembler high-level language libraries framework
  24. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic
  25. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP
  26. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL
  27. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly
  28. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go
  29. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch
  30. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal
  31. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal MATLAB
  32. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal MATLAB Swift
  33. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal MATLAB Swift Fortran
  34. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal MATLAB Swift Fortran R
  35. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal MATLAB Swift Fortran R Kotlin
  36. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal MATLAB Swift Fortran R Kotlin Ruby
  37. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal MATLAB Swift Fortran R Kotlin Ruby Rust
  38. #RedHat @holly_cummins choosing a programming language 1963 Fortan ALGOL COBOL

    LISP 2023 Python C C++ Java C# JavaScript Visual Basic PHP SQL Assembly Go Scratch Pascal MATLAB Swift Fortran R Kotlin Ruby Rust …
  39. @holly_cummins #RedHat quarkus + chat gpt this is wrong in

    every way (there is no quinoa cli, and having one would be a bad design)
  40. @holly_cummins #RedHat quarkus + chat gpt this is wrong in

    every way (there is no quinoa cli, and having one would be a bad design)
  41. @holly_cummins #RedHat quarkus + chat gpt this is wrong in

    every way (there is no quinoa cli, and having one would be a bad design) this is not necessary (it misses a major quarkus usability feature)
  42. #RedHat @holly_cummins copilot users accepted 30% of its suggestions copilot

    produced 40% of the codebase uh oh, what does that say about the information density?
  43. #RedHat @holly_cummins if code is so boring a machine can

    predict it, maybe it shouldn’t be there?
  44. #RedHat @holly_cummins we see you will be using a database

    <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-postgresql</artifactId> </dependency> pom.xml
  45. #RedHat @holly_cummins we see you will be using a database

    we see you do not have one <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-postgresql</artifactId> </dependency> pom.xml # This config deliberately left empty application.properties
  46. #RedHat @holly_cummins we see you will be using a database

    we see you do not have one <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-postgresql</artifactId> </dependency> pom.xml # This config deliberately left empty application.properties we’ll just sort one out for you
  47. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-SALARY PIC 9(7)V99

    VALUE 01 WS-DATE PIC 9(8). 01 WS-MONTH PIC 99. 01 WS-YEAR PIC 9999. 01 WS-PAYMENT-MADE PIC X(3) VALUE 'NO PROCEDURE DIVISION. MAIN-PROCEDURE. PERFORM INITIALIZE-DATA PERFORM CHECK-PAYMENT PERFORM DISPLAY-RESULT STOP RUN. example: using chat-gpt to document a legacy codebase
  48. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-SALARY PIC 9(7)V99

    VALUE 01 WS-DATE PIC 9(8). 01 WS-MONTH PIC 99. 01 WS-YEAR PIC 9999. 01 WS-PAYMENT-MADE PIC X(3) VALUE 'NO PROCEDURE DIVISION. MAIN-PROCEDURE. PERFORM INITIALIZE-DATA PERFORM CHECK-PAYMENT PERFORM DISPLAY-RESULT STOP RUN. example: using chat-gpt to document a legacy codebase the documentation chat-gpt wrote is wrong!
  49. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-SALARY PIC 9(7)V99

    VALUE 01 WS-DATE PIC 9(8). 01 WS-MONTH PIC 99. 01 WS-YEAR PIC 9999. 01 WS-PAYMENT-MADE PIC X(3) VALUE 'NO PROCEDURE DIVISION. MAIN-PROCEDURE. PERFORM INITIALIZE-DATA PERFORM CHECK-PAYMENT PERFORM DISPLAY-RESULT STOP RUN. example: using chat-gpt to document a legacy codebase the documentation chat-gpt wrote is wrong! umm … actually, the code doesn’t do what we thought it did
  50. @holly_cummins #RedHat programming in diagrams instead of words turns out

    to be a lot of work remember model-driven development?
  51. @holly_cummins #RedHat “I tried being exhaustive with explanations about things

    like the data range, input shapes and reasons for parameters, and with enough explanation it will eventually come to the right conclusions - but it’s far more effort to exhaustively explain what I need than to just write the code” https://news.ycombinator.com/item?id=34848353 example: copilot
  52. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant cognitive load ai coding assistant machine codes assembler high-level language libraries framework
  53. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant security observability quality shift left
  54. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant security observability operations quality shift left
  55. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant security observability operations usab quality shift left
  56. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant security observability operations usab quality ud bills shift left
  57. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant security observability operations usab quality ud bills shift down
  58. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant security observability operations usability quality cloud bills shift down
  59. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant security observability operations usability quality cloud bills shift down
  60. transistor networks framework application high-level language assembler machine codes libraries

    ai coding assistant security observability operations usability quality cloud bills shift down value
  61. human alarm clock 1800s finite demand only employees need waking

    up no one needs waking up more than once - 1940s
  62. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software
  63. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show
  64. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software
  65. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software
  66. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software software to manage the software
  67. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software software to manage the software software to write the software
  68. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software software to manage the software software to write the software software to manage the software that writes the software
  69. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software software to manage the software software to write the software software to manage the software that writes the software software to try and avoid skynet
  70. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software software to manage the software software to write the software software to manage the software that writes the software software to try and avoid skynet software to tell people about software
  71. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software software to manage the software software to write the software software to manage the software that writes the software software to try and avoid skynet software to tell people about software software to work out the meaning of life
  72. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software software to manage the software software to write the software software to manage the software that writes the software software to try and avoid skynet software to tell people about software software to work out the meaning of life software to gamify software
  73. #RedHat @holly_cummins software to do stuff software to do more

    stuff software to bypass advertisements in the software software to bypass the bypass software so ads still show software to monitor the software software to debug the software software to manage the software software to write the software software to manage the software that writes the software software to try and avoid skynet software to tell people about software software to work out the meaning of life software to gamify software …
  74. @holly_cummins #RedHat tl;dpa (too long; didn’t pay attention) abstraction is

    good. shift down, to make shifting left easier don’t generate boilerplate, eliminate it coding assistants are great at … typing it is awesome being a developer