No Fluff Just Stuff Austin 2014

I went to my favorite software conference again: No Fluff Just Stuff. The main reasons I attend are the great speakers and small class sizes provide for the opportunities to have real-world conversations about my environment.

The good and bad part of this conference is that it is on a weekend. It has little impact on my working hours, but I do lose a weekend. Most of the time my family will come with me and we’ll make an adventure out of it, but unfortunately schedules didn’t line up this year.

The fact that it is on a weekend is why many people from work probably do not want to attend. I cannot blame them, but they would gain huge benefits from talking with people who are already well experienced in where we want to be.

I have years of notes from NFJS, but putting them into soft copy always gets pushed to a back burner. Not this year!

Technology Radar – Neal Ford

this is one of my favorite talks every year, but unfortunately I had a conflicting session and could not attend. I put it here mainly for reference.

Key technologies/concepts to research

Continuous Delivery p1 – Neal Ford

  • Separate release from deployments
  • DevOps Kata – Single Line of Code – devopsy
    • how hard is it for your shop to deploy a one-line code change?
    • Dave Thomas’ CI book
  • Continuous Integration
    • check-in early and often
    • integration with other pieces is toughest part, and used to be done at end of project, which made it very difficult. You will find issues sooner, and integration will be much easier if done earlier in software life cycle
  • Continuous Deployment
    • Cycle Time – competitive advantage to try things ASAP and get immediate results instead of releasing once every 6 months and hope your users like the massive change
  • Scrummer-Fall – waterfall agile – very bad
  • Cruise Go – now-free build offering from Thought Works

Understanding Java Memory – Ken Sipe

Top Agile Pitfalls That Lead to Trouble – Andy Painter

  • Estimates are guesses and the sooner everyone in your organization realizes this, the happier everyone will be
  • Goal is to be a better software shop 1 year from today
  • Dr. Dobb’s agile surveys over the years on Agile adoption show huge trend up in usage
  • 2 pizza rule: no team should be so big that 2 pizzas cannot feed them
  • keep teams consistent. personnel changes drastically hurt the team’s performance since they have already experienced the Deming Cycle together
  • Key Agile Metrics
    • Velocity
      • measures how many user stories you average in a given time frame or sprint
      • poorly named: Planning Tool instead of accelerator.
      • Which is faster, waterfall or agile?
        • Apples & Oranges comparison trying to compare the two since their approach is so different
      • average of last 8 releases is good indication of velocity because in that time frame, people will have taken vacations, sick leave, etc.
      • after 3-4 sprints you will have a good indication of your potential for velocity
      • 30 pt velocity per week and over 6 weeks, you can do 180 stories. If Biz wants 200, then tough shit. Tough shit conversations are extremely important for the process, and forces everyone to make decisions on priorities sooner in the process.
      • possible to re-estimate stories as you go since you will have more knowledge of the system
    • Backlog
      • one and only one location for backlog
      • clear priority of backlog
      • enhances self-organizing dynamic of IT shop

Continuous Delivery for Architects – Neal Ford

  • If This Then That – IFTTT
  • Conway’s law
    • organizations which design systems … are constrained to produce designs which are copies of the communication structures of these organizations
  • Book: Domain Driven Design by Vaugn Vernon
  • Environment Config/Build tools: Ancible, Docker, Puppet, Chef
  • Death by Coupling
    • Coupling is biggest issue, which means a simple change could have huge side effects/impact
  • 2 Pizza rule: teams must be small enough to be fed by 2 pizzas
  • Metrics & Monitoring
    • Cyclomatic complexity
      • measures function/method complexity by looking at logic and giving it a value
      • the higher the number, the more complex the method. code should be made of many, less complex methods instead of fewer large onces
    • Afferent Coupling – incoming references to method
    • Efferent Coupling – outgoing references to method
  • Tools
  • Tool Limitations
    • signal to noise
    • no 1 true metric to grade upon
    • gathered, but ignored
    • inaction/overaction
    • we should prefer trends over discrete values
  • Separate Feature from Release
  • Antipatterns – circular dependencies
  • Jigsaw — Project Kenai & OSGi
  • Tools to help prevent circular dependencies
  • Prefer REST over SOAP
    • versioning
      • prefer semantic over endpoint version
      • expand & contract paradigm, borrowed from DB structures
  • Consumer Driven Contracts
    • Created by Martin Fowler
    • allows endpoints to evolve w/ Consumers and provide tests
    • many consumers = successful product
  • (Micro)Services
    • monoliths vs. microservices
    • smart endpoints, dumb pipes
    • as decoupled and cohesive as possible
    • small, single responsibility
      • makes it easy to prefer rewrite over maintain
    • services should be JSON pumps for UI/Services to consume
  • Products, NOT Projects. You build it, you maintain it
  • Truck Number
    • Or more commonly called Bus factor in America
      • High bus numbers are good (with the best case being equal to the number of developers on a project). This means all developers understand the codebase more or less equally. A low bus number (especially, one) represents a high risk.
  • 2 phase commit is a really bad idea
    • banks existed before corporations
    • pony existed before ATM. Ponies did not have 2 phases
  • Automate synthetic transactions to smoke test deployments
  • Tool
    • Dropwizard – Template service similar to Jersey
  • Video: Micro Services: Java, the Unix Way
  • Components are deployed. Features are released.
    • use toggle to enable/disable features
  • Dietzler’s Law – users want 100% of what they want and nothing less
    • 80-10-10 Rule: 80% is doable in a relatively short amount of time, 10% is possible, but lots of effort, and the last 10% is impossible due to technical restrictions
  • Software does not age, it rots
  • Tech Debt
    • defects vs. debt
      • defects are bugs in the code
      • debt are bugs in how it was coded, whether it causes a bug or not
  • Yesterday’s best practice is today’s anti-pattern

Android p1 – Ken Kousen

  • Android Studio (AS) for dev is prefered over Eclipse plugin
    • Google makes updates to AS, but not Eclipse lately
  • Android Developers
  • Dalvik is being switched for ART (Android RunTime)
  • Testing must be done on device or emulator
    • de facto integration test only
    • will prob change to Unit test features in future
  • will move to Gradle builds in near future
  • OS aspects are all services
    • provides updates so carriers cannot pigeon hole users to a specific version
    • Forks – lose all services when forking codebase
      • only two successful forks: Kindle and the major flavor in China who wrote their version of all services
  • Market share: Android ~80%
  • Revenue share: Apple slightly higher than 50%
  • Generate code for both
  • Hello World example
  • package name is very important for Google Play Store to distinguish apps
  • XML project config is not deployed w/ app
  • XML is what generates the r.java
  • built in localization via /res/strings.xml
  • Apps live on callbacks
  • Manifest file is starting point to see entry into app
  • Linear Layout vs. Relative Layout
    • default for Linear is horizontal, but prob want vertical for form data
  • EditText
    • like HTML textfield
  • @+id – is for defining ID
  • @id – is for referencing ID
  • Views are widgets and can be groups of Views
  • AVD Manager
    • emulator
    • HAX Plugin and Seperate install for enhanced emulator performance (seconds vs. minutes)
  • Minimum and Target SDK
    • apps are configured for a minimum compatibility and a target compatibility of an SDK

Android p2 – Ken Kousen

  • Compile with – pick latest because it will handle compatibility plumbing
  • Fragmentation will get better over time
  • Higher res photos and art will scale better on all devices
  • Eclipse test requires 2nd project w/ dependency on primary project
    • hard to test outside of IDE (e.g. during build)
    • gradle will fix this eventually
  • Eclipse has WYSIWYG editor that is sometimes easier to deal with
  • Activity Lifecycle
    • 1 screen is an Activity
  • Logging
    • not like log4j – all methods static
    • log.v(TAG, “msg”)
    • log.wtf = What a Terrible Failure
    • Filters – strings
    • Tag – to filter when viewing
  • Android Debug Bridge
    • adb devices
    • kill-server
    • start-server
  • config – always prompt to pick device (e.g. emulator, or attached phone/tablet)
  • Favorite apps only call certain Lifecycle events
  • roate device calls certain life cycles
    • data must be saved and account for this, but many times actions occur so fast it’s not an issue
  • onSaveInstantState()
    • save state of app
    • only happens if doDestroy
    • outstate.putStr(display)
    • restored in onCreate()
  • Providing Resources
    • Nighte Mode
  • Android lint
    • The Android lint tool is a static code analysis tool that checks your Android project source files for potential bugs and optimization improvements for correctness, security, performance, usability, accessibility, and internationalization.
  • emulator can leverage camer on computer
    • Broadcast-Recevers – emulate phone actions
      • text message, GPS, incoming call, battery failure
  • SensorSimulator
    • for simulating sensor data in real time
  • Google Play requires 2 screenshots to be in Google Play Store
  • Droid @ Screen
    • Show your Android device for your audience
  • Toast
    • little pop-up that fades away with useful info
    • toast.makeText(…).show()
    • can customize screen location with gravity
  • Intent
    • object trying to transfer data from A to B
    • Explicit & Implicity
      • Excplicit – Specify component to stage
      • Declare action to perform (in Manifest)
    • Extras
      • data carried to destination (key-value map)
  • Views & Adapters
    android.r.XYZ
    – lots of display options (e.g. layout for tables, etc.)
  • github.com/kousen
    • hello world
    • ICNDB project
  • Commonsware
  • The Busy Coder’s Guide to Android Development
    • $$$ – online book that is updated every 6 weeks or so

Android p3 – Ken Kousen

  • XML Layout is just starting point then programmatically change it
  • gradle can build variances of app (e.g. free, paid, etc.)
  • /gen = generated java files
  • issue: if R.java file doesn’t generate, probably an XML file error
  • AsyncTask
    • prefered over Threads & Process in native Java
    • do NOT access UI thread outside of UI thread
    • use Concurrent & Execution instead of Thread class in Java
    • long running tasks, use Service object
    • users like to see progress bar
    • possible to disable rotation for longer executions, but users still may hit back button
    • Steps for AsyncTask
      • onPreExecute()
      • doInBackground()
      • onProgressUpdate()
      • onPostExecute()
    • cancel(boolean) to cancel task
    • resume download if issues – 3rd party libraries handle this better
      • probably included in future releases
    • IntentService – for long running tasks in background, not typically for GUI
  • MenuItem
  • ActionBar
    • split action bar
  • REST
    • org.json
    • android.util
      • JSonReader
      • JSonWriter
    • Spring for Android
      • RestTemplate – good rest client for general Java
      • wrap/unwrap JSON to objects and vice-versa
    • eclipse – must download file and put jars in /lib directory
      • if using gradle, it will automatically be done
    • GSon to convert back and forth between JSON and Objects
    • ICNB.com -> API
    • Check network connection
      • ConnectivityManager
      • getSystemService(Context.connectivityService)
      • NetworkInfo.isConnected()