Skip to content

Software Development Blogs: Programming, Software Testing, Agile Project Management

Methods & Tools

Subscribe to Methods & Tools
if you are not afraid to read more than one page to be a smarter software developer, software tester or project manager!

Feed aggregator

Android Studio 3.0 Canary 1

Android Developers Blog - Thu, 05/25/2017 - 21:58
.prettyprintcustom { font-size: 12pt; background-color: black; color: white; text-align: left; } .code { font-size: 12pt; } .dl { text-align: left; }

By Jamal Eason, Product Manager, Android

Just in time for Google I/O 2017, we're providing a sneak peak of Android Studio 3.0 - available to download today on our canary release channel. Android Studio's our official IDE, purpose-built for Android, and we keep increasing our investment. The feature set in Android Studio is focused on accelerating your app development flow and providing the latest tools built for the Android platform.

To accelerate your development flow, Android Studio 3.0 includes three major features: a new suite of app performance profiling tools to quickly diagnose performance issues, support for the Kotlin programming language, and increased Gradle build speeds for large sized app projects. Android Studio 3.0 also tightly integrates with Android platform development with these additional key features: support for Instant App development, inclusion of the Google Play Store in the Android O emulator system images, and new wizards for Android O development. Overall, this first canary release of Android Studio 3.0 has 20+ new features.

We have been quietly iterating on many of these features as part of the Android Studio 2.4 Canaries. Today we are renumbering the release to Android Studio 3.0 after recognizing that we added many significant features, and that we had to introduce a rare breaking change in the Android Gradle Plugin to improve scalability and build times. If you want to target Android O, create an Instant App, start developing with the Kotlin language or use the latest in Android app performance tools to improve your app quality then you should download Android Studio 3.0 Canary 1 today.
What's New in Android Development Tools - Google I/O '17


Check out the the list below organized into key developer flow for the details of the new features in this first canary release of Android Studio 3.0.

Develop
  • Kotlin Programming Language - By popular request, Android Studio 3.0 now includes support for Kotlin. With this new language support, you can seamlessly add Kotlin code next to your existing Android app code and have access to all the great development tools found in Android Studio. You can choose to add Kotlin to your project using the built-in conversion tool found under CodeConvert Java File to Kotlin File, or you choose to create a Kotlin enabled project with the New Project Wizard. Lean more about Kotlin language support in Android and Android Studio.

Kotlin Language Conversion in Android Studio

  • Java 8 Language features - We are continuing to evolve the support for Java 8 language features and APIs. With the recent deprecation of the Jack toolchain and migration to the javac based toolchain, you have access to features such as Instant Run for projects using the Java 8 language features in Android Studio. To update your project to support the new Java 8 Language toolchain, simply update your Source and Target compatibility levels to 1.8 in the Project Structure dialog. Learn more.
Update Project Structure Dialogue for Java 8 Language



  • Layout Editor - With this Android Studio release, you will find additional enhancements to the Layout Editor. We have updated the component tree with better drag-and-drop view insertions, and a new error panel. In coordination with an update to ConstraintLayout, the Layout Editor also supports creating view Barriers, creating Groups, and enhances Chain Creation. Learn more.
Layout Editor Component Tree & Warning Panel


  • Adaptive Icon Wizard - Android O introduces adaptive launcher icons, which can display in different shapes across different Android devices. The new Adaptive Launcher Icon wizard creates the new and legacy launcher icon assets and provides previews of how your adaptive icon will look on different launcher screen icon masks. Create a new asset by right-clicking on the /res folder in your project then navigate to → NewImage AssetLauncher Icons (Adaptive and Legacy) Learn more.
Adaptive Icon Wizard


  • XML Fonts & Downloadable Fonts - Adding custom fonts to your app (available when targeting Android O) is now even easier with the XML fonts preview and font selection tools in Android Studio. You can can also create a downloadable font resource for your app. Using downloadable fonts allows you to use a custom font in your app while avoiding the need to bundle in a font resource into your APK. To use downloadable fonts, ensure that you device or emulator is running Google Play Services v11.2.63 or higher. Learn more.
Downloadable Fonts Resource Picker
XML Fonts Preview



  • Android Things Support - With Android Studio 3.0, you can start developing on Android Things with a new set of templates in the New Project wizard and the New Module wizard. Android Things allows you to extend your Android development knowledge into the Internet of Things (IoT) device category. Learn more.

Android Things New Module Wizard 



  • IntelliJ Platform Update: Android Studio 3.0 Canary 1 includes the IntelliJ 2017.1 release, which has features such as Java 8 language refactoring, parameter hints, semantic highlighting, draggable breakpoints, enhanced version control search, and more. Learn more.

Build
  • Instant App Support - With Android Studio 3.0, you can create Instant Apps in your project. Instant Apps are lightweight Android apps that your users can immediately run without installation. To support this, Android Studio introduces two new module types: instant app and feature. Combined with a new "Modularize" refactoring action and the App Links Assistant, Android Studio can help you extend your app into an Instant App. To use you can use the New Module Wizard or right-click on a class and navigate to: RefactorModularize Learn more.

Instant App Module Wizard


  • Build Speed Improvements - We are continuing to invest in making build speeds faster. For this release, we focused on improving speed for projects that have many modules. To achieve these speed improvements and to support future enhancements, we have made breaking API changes to the Android Gradle plugin used by Android Studio. If you depended on APIs provided by the previous plugin you should validate compatibility with the new plugin and migrate applicable APIs. To test, update the plugin version in your build.gradle file. Learn more.



build.gradle
dependencies {
   classpath 'com.android.tools.build:gradle:3.0.0-alpha1'
}
  • Google's Maven Repository - Also, by popular request, we are now distributing the Android Support Library maven dependencies outside of the Android SDK Manager in a brand new Maven repository. For those developing with a Continuous Integration (CI) system, this should make Maven dependency management easier. Used in combination with the latest command line SDK Manager tool and Gradle, CI builds should be easier to manage with Google's Maven Repository. To use the the new Maven location, add the following url to your app module's build.gradle file. Learn more.
build.gradle
repositories {
   maven {
       url "https://maven.google.com"
   }
}



    Test & Debug
    • Google Play System Images - Along with the update to the Android O Beta release, we updated the Android Emulator O system images to include the Google Play Store. Bundling in the Google Play store allows you to do end-to-end testing of apps with Google Play, and provides a convenient way to keep Google Play services up-to-date in your Android Virtual Device (AVD). Just as Google Play services updates on physical devices, you can trigger the same updates on your AVDs.
    Google Play Store in Android Emulator


    Update Google Play Services in Android Emulator



    To ensure app security and a consistent experience with physical devices, the emulator system images with the Google Play store included are signed with a release key. This means you will not be able to get elevated privileges. If you require elevated privileges (root) to aid with your app troubleshooting, you can use the Android Open Source Project (AOSP) emulator system images that do not include Google apps or services. To get started, make sure you are using Android Emulator v26.1+, the latest system images API 24+ and then create a new AVD with a Google Play icon next to the device definition. Learn more.

    Android Virtual Device Manager with Google Play Store Support 




    • OpenGL ES 3.0 Support in Android Emulator - As a part of our ongoing investment in making your development experience fast, the latest version of the Android Emulator has OpenGL ES 3.0 support for Android O system images along with significant improvements in OpenGL ES 2.0 graphics performance for older emulator system images. Most modern graphics cards on all operating systems support OpenGL ES 2.0 acceleration. To use OpenGL ES 3.0 with the Android Emulator, your development machine needs a host GPU graphics card that supports OpenGL 3.2 or higher on Microsoft® Windows® or Linux (with Apple MacOS® support coming in the future). Learn more.


    OpenGL ES 3.0 in Android Emulator



    • App Bug Reporter in Android Emulator - To help in documenting bugs in your app, we have added an easier way to generate a bug report with all the necessary configuration settings and space to capture your repro steps. Additionally, if you want to share a specific emulator bug with the Android team, we have also added a link to quickly generate a bug on the Android Issue Tracker. To use this feature, navigate to the Emulator Tool BarExtended ControlsHelpEmulator HelpFile a Bug. Learn more.

    App Bug Reporting in Android Emulator

    • Proxy Support in Android - For those who need to use a HTTP proxy to access the Internet, we have added a user interface to manage the proxy settings used by the emulator. By default, the Android Emulator will now use the settings from Android Studio, but you can override these settings for your network setup. To configure navigation to the Extended ControlsSettingsProxy.
    Android Emulator Proxy Settings

    • Android Wear Rotary Controls in Android Emulator - The Android Emulator now supports rotary controls for the Android Wear 2.0 emulator system image. It is now easier to test your apps that target Android Wear devices that include rotary input scrolling. To enable, create an Emulator AVD that targets Android Wear, and the Rotary Input panel should appear under Extended controls. Learn more.

    Rotary input in Android Emulator


    • APK Debugging - For those of you who just want to debug an APK without building your project in Android Studio, the Android Studio 3.0 release now has the ability to debug an arbitrary APK. This functionally is especially helpful for those who develop your Android C++ code in another development environment, but want to debug and analyze the APK in the context of Android Studio. As long as you have a debuggable version of your APK, you can use the new APK Debugging features to analyze, profile & debug the APK. Moreover, if you have access to the sources of your APK, you can link the source to the APK debugging flow for a higher fidelity debugging process. Get started by simply selecting Profile or debug APK from the Android Studio Welcome Screen or File → Profile or debug APKLearn More.

    Profile or Debug an APK

    APK Debugging

    • Layout Inspector - You will find that the Layout Inspector has a few additional enhancements in Android Studio 3.0 that make it easier to debug issues in your app layouts. A couple of the enhancements include better grouping of properties into common categories, as well as search functionality in both the View Tree and Properties Panels. While an application is running, access the Layout Inspector via ToolsAndroidLayout Inspector. Learn more.
    Layout Inspector

    • Device File Explorer - Ported from DDMS into Android Studio by popular demand, the new Device File Explorer allows you to view the file and directory structure of your Android device or emulator. As you are testing your app, you can now quickly preview and modify app data files directly in Android Studio. Learn more.

    Device File Explorer


    Optimize
    • Android Profiler - Android Studio 3.0 includes a brand new suite of tools to help debug performance problems in your app. We completely rewrote the previous set of Android Monitor tools, and replaced them with the Android Profiler. Once you deploy your app to a running device or emulator, click on the Android Profiler tab and you will now have access to a real-time & unified view of the CPU, Memory, & Network activity for your app. Each of the performance events are mapped to the UI event timeline which highlights touch events, key presses, and activity changes so that you have more context on when and why a certain event happened.  Click on each timeline to dig into each performance aspect of your app. Learn more

    Android Profiler - Combined timeline view.
    • CPU Profiler - Unnecessary CPU processing and load spikes are symptoms of poor app performance. With the CPU Profiler, you can analyze the CPU thread usage of your app by triggering a sample or instrumented CPU trace. At this point, you can troubleshoot CPU performance issues using a variety of data views and filters built into the CPU Profiler. Learn more.

    CPU Profiler


    • Memory Profiler - Using memory inefficiently can lead to many device problems ranging from a janky UI to low memory events. The Memory Profiler combines the functionality of the previous Heap Viewer and Allocation Tracker in one rich interface to help debug memory usage problems in your app. You can diagnose a range of memory issues by analyzing memory allocations, heap dumps and more. Learn more.

    Memory Profiler


    • Network Profiler - Optimizing foreground and background network usage in your app can lead to a more performant app and lower app data usage. The network profiler allows you to monitor the network activity of your app, inspect the payload of each of your network requests, and link back to the line of source code that generated the network request. Currently, the network profiler works with HttpURLConnection, OkHttp, and Volley network libraries. The network profiler is an advanced analysis feature that can be enabled on Pre-Android O devices & emulators by selecting Enable Advanced Profiling in the Profiling Tab in the Run Configuration box. In addition to enabling network request and payload analysis, this checkbox enables event collection at the top level, memory object count, and memory garbage collection. For Android O-based devices and emulator, just deploy your app. Learn more.
    Network Profiler



    Network Profiler Setup for Pre- Android O Devices

    • APK Analyzer Improvements - In Android Studio 3.0, we have added some additional enhancements to the APK Analyzer to help you further optimize the size of your APK. With this feature update, you can now analyze Instant App zip files & AARs, and view dex bytecode of classes & methods. You can also generate Proguard configuration rules and load Proguard mapping files in the dex viewer. Learn more.

    APK Analyzer





    To recap, Android Studio 3.0 Canary 1 includes these new major features: 

    Develop


    Build


    Test & Debug

    Optimize
    Check out the release notes for more details.
    Android DevByte - What’s New in Android Studio 3.0 Canary 1
    Getting Started Download

    If you are using a previous version of Android Studio, you can install Android Studio 3.0 Canary 1 alongside your stable version. You can download this update from the official Android Studio Preview download page. As mention in this blog, there are some breaking Gradle Plugin API changes to support new features in the IDE. Therefore, you should also update your Android Gradle plugin version to 3.0.0-alpha1 in your current project to test and validate your app project setup.

    We appreciate any feedback on things you like, issues or features you would like to see. If you find a bug or issue, feel free to file an issue. Connect with us -- the Android Studio development team ‐ on our Google+ page or on Twitter.

    Categories: Programming

    I Smell Dysfunction

    Herding Cats - Glen Alleman - Wed, 05/24/2017 - 21:57

    Screen Shot 2017-05-24 at 11.11.29 AMA popular phrase in some agile areas is 

    X is the Smell of Dysfunction. Y will fix that, usually by NOT doing some established principle known to work, only if you knew how to make it work.

    Estimates, governance, planning, architecture, financial forecasting - pick you poison.

    One naive response to this smell of dysfunction is to conjecture a solution with no evidence that the problem OR the solution have any principles to be based on that will fix the observed problem.

    Let's not do X and the smell will be removed is a common approach. Common at least when the understanding of how to solve problems is missing

    The first failure mode of this logic is we don't actually know what the dysfunction is before conjectured we have a solution.

    Next, comes the naive approach of asking Five Whys without actually understanding how the process of Root Cause Analysis works.

    Asking why is a necessary step, but far from sufficient.

    • What condition allowed the dysfunction to occur?
    • What action occurred that created the dysfunction?

    The notion of Condition and Action created an Effect is the basis of Root Cause Analysis using the Apollo method. Without a Root Cause Analysis, any suggested fix for the dysfunction is bogus. You don't even know what the problem is, let alone that the solution will fix that problem or any problem.

    So when you see a NO in front of some word, like #NoEstimates, #NoProjects, #NoManagement, and you don't see the Root Cause Analysis, and a list of testable corrective actions, then ignore anything from that point on. It's either bogus or a hoax.

    So read Seven Steps to Effective Problem Solving and start solving problems rather than listening to unsubstantiated claims of how that problem could be solved. We have a saying (actually we have many sayings) in our Software Intensive System of Systems world ...

    Unicorn

    That's a Unicorn solution - meaning only if you believe in Unicorns will that cockamamy idea work

    And if you work in our space and defense domain, you'll recognize the uniformed version of the unicorn solution. It's called the Good Idea Fairy.

    Good Idea Fairy

    Related articles Are Estimates Really The Smell of Dysfunction? Estimating and Making Decisions in Presence of Uncertainty The Bad Apple Syndrome in Process Improvement Carl Sagan's BS Detector Making Conjectures Without Testable Outcomes
    Categories: Project Management

    Request a professional app translation from the Google Play Console and reach new users

    Android Developers Blog - Wed, 05/24/2017 - 18:45
    .post-content img { border: 0 0 0 0; margin: 0 0 0 0; padding: 20px 0 10px 0; max-width: 100%; } .stars { color: gold; text-align: center; } .use { font-style: italic; font-size: 8pt; text-align: center; } Posted by Rahim Nathwani, Product Manager, Google Play
    Localizing your app or game is an important step in allowing you to reach the widest possible audience. It helps you increase downloads and provide better experiences for your audience.
    To help do this, Google Play offers an app translation service. The service, by professional linguists, can translate app user interface strings, Play Store text, in-app products and universal app campaign ads. We've made the app translation service available directly from inside the Google Play Console, making it easy and quick to get started.
    • Choose from a selection of professional translation vendors.
    • Order, receive and apply translations, without leaving the Play Console.
    • Pay online with Google Wallet.
    • Translations from your previous orders (if any) are reused, so you never pay for the same translation twice. Great if you release new versions frequently.
    Using the app translation service to translate a typical app and store description into one language may cost around US$50. (cost depends on the amount of text and languages).
    Find out more and get started with the app translation service.

    How useful did you find this blogpost? ★ ★ ★ ★ ★
    Categories: Programming

    Production ready AWS ECS (EC2 Container Service)

    Xebia Blog - Wed, 05/24/2017 - 16:59

    Are you looking to run Docker containers on AWS? Or are you looking to use AWS ECS (EC2 Container Service)? Does it need to be production ready? If so, then speed up your process and be ready today by looking at my GitHub repository on ECS. It contains infrastructure as code with Terraform for a […]

    The post Production ready AWS ECS (EC2 Container Service) appeared first on Xebia Blog.

    Announcing the Women Techmakers Udacity Scholarship

    Google Code Blog - Wed, 05/24/2017 - 16:49
    .post-content img { border: 0 0 0 0; margin: 0 0 0 0; padding: 10px 0 0 0; } Posted by Amy Schapiro and the Women Techmakers team

    The community of women in tech is growing in numbers and influence, which we witnessed firsthand just last week at Google I/O, Google's biggest developer conference of the year. Our total attendees were 25% women, thanks in large part to creating a number of cross-industry partnerships supporting women developer communities. 25% of the speakers were women as well.

    We know working together as a community is key to supporting women in tech. To that end, we are excited to announce a new collaborative resource. Women Techmakers is launching a new scholarship for women in tech around the world to increase their skills through enrolling in an online technical degree - the Women Techmakers Udacity Scholarship. Women Techmakers, Google's global program for women in technology, provides visibility, community and resources for women and allies around the world. Women Techmakers has partnered with Udacity, one of the world's leading online training platforms, as Udacity's flagship partner for women in technology to provide this scholarship to women across experience levels and geographies.

    This new scholarship provides the opportunity for women to earn online certification in Android Basics , Android Developer, Front-End Web Developer and Full-Stack Developer, all courses co-designed by Google experts, and includes opportunities for women at multiple skill levels. Benefits include special access to a community of Googlers and a cross-cohort global online community. Upon completion of the Nanodegree within one year, scholars will receive certification from Udacity, a certificate of completion from Women Techmakers, a resume review by a Googler, and more.

    This scholarship is the newest offering in a portfolio of Women Techmakers programs to support women and allies globally, including Membership for curated, personalized professional support, our video series and guides on building inclusive tech hubs, and our Scholars program, which provides funding and support for university women studying computer science.

    Click here to learn more and apply by June 9th, 2017.

    Categories: Programming

    Asking Questions: Hints For Improving Your Question Making Skills

    Horse Crossing Sign

    What is the Question?  Horse Crossing

    Questions are a powerful tool for eliciting information, helping people grow, or leading people.  However asking questions often requires more than just opening your mouth and uttering the first words that come to mind.  Asking the right questions at the right time is a combination of art, science, and preparation.

    1.     Have a Goal

    Establish what your end game is for asking a question.  For example, are you trying to gather facts, an opinion, or change behavior?  Your goal will affect both how you phrase a question and timing of delivery.

    1.     Develop a Strategy

    Depending on the goal, the questioner needs to decide how they interact with the person they are going to ask questions.  I recently provided advice for a leader that wanted to help an employee identify and address a behavior issue.  The set of questions we agreed upon were designed to help the employee identify and then develop a solution to the problem.  The strategy was very different than the questioning strategy I would employ for a guest on the Software Process and Measurement Cast.  The strategy needs to meet the goal of the conversation

    1.     Loosely Script Questions

    Based on the goal and strategy, develop a loose script of questions.  For example, if I am trying to gather information or opinions I will put together a set of questions with possible follow-up questions.  Even if you never use the script, game planning the interaction can make it easier to listen rather than concentrate on thinking up the next question. Consider starting by asking broad questions then spinning down into more detailed questions.

    1.     Use Humor and Negative Emotion Carefully

    Humor is a great tool to build connections between people.  The problem is that one person’s humor is not always the same as another’s. When humor doesn’t click the interaction will tend to shut down.  Anger (real or feigned) makes a great theater in oration, however, embedding anger in a question will tend to shut a conversation down and cause the person answering the question to be very guarded, reducing the value of the answer.

    1.     Open Conversation (if that fits with the goal)

    Use questions to facilitate an open conversation. Open-ended questions are often a good tool to get a person to open up and begin talking.  For example, asking a development team to describe the project they are currently working on will illicit more information than asking whether a team made the date they committed to making.

    1.     Listen

    Ask a question, then stop and listen to the answer.  Listening is not the same as using the time to create a new question or to answer a text message.  Multitasking is a myth.  Listen first, then react to what you have heard.

    1.     Ask Only What You Need

    There is an old maxim, take what you need and leave the rest.  Time is precious: do not abuse the time and attention you get when interacting with people.

    These are just a few suggestions for getting better at asking questions.  Some of them, such as having a goal and strategy, are applicable to every scenario. Scripting might not be needed in every situation. However you likely need to consider your approach if asking something more complicated than whether dinner will be in 30 minutes. Even then, I think conscious thought might be needed.


    Categories: Process Management

    Defining “Scaling” Agile, Part 2: Program Management for Product Development

    The first post was about scaling functions to working as collaborative agile teams. See Defining “Scaling” Agile, Part 1: Creating Cross-Functional Teams. Now, let’s talk about moving to multiple teams working together, a program.

    The good news is that you have a few cross-functional teams. They’ve been delivering as project teams. And, now you have a program, a collection of several projects with one business objective.

    Programs come in a wide variety of shapes and sizes. Here are some kinds of programs:

    • You might have just one feature team and need people from Marketing or Legal to release the product. You need to bring those people into the program somehow, so they can accomplish their deliverables so the organization can release the product.
    • The project is larger than one or two feature teams. You may have several feature sets and need people from Marketing, or Legal, or Finance (or someone else) to be able to release the product.
    • You might be managing the software program, and have several feature teams or programs within the larger program. You might have the Engine program, and the Admin and Diagnostics programs. Each feature set has several teams collaborating on the code in their feature set(s). And, you probably need people across the organization to finish the work for the product. Those are the people from Marketing, Legal, Finance or others that I keep talking about.

    Programs exist when you need a little structure to organize the feature teams and/or organize the deliverables across the organization. Agile programs especially don’t need too much structure. The key is to create something that helps the people collaborate and visualize the work they need to complete.

    Here’s a way to think about scaling to a program:

    Scale the collaboration across product development to release products. 

     Scaling Collaboration Across the OrganizationYes, I wrote a book about that:  Agile and Lean Program Management: Scaling Collaboration Across the Organization.

    Here’s how I think about scaling collaboration across product development:

    • Each team thinks about how fast they can release their work to the rest of the program. (BTW, fast isn’t useful unless the work is great.)
    • Each team manages its WIP (Work in Progress) so they aren’t bottlenecking themselves or anyone else.
    • The POs work as a team so the feature teams always work on the most valuable work for the program. Sometimes, feature teams move from one feature set to another because that work is more valuable. If you’re worried about interdependencies, you might not have feature teams. Or, the POs aren’t working together. See Understand Your Project Interdependencies.
    • Teams use the power of their small-world networks (and possibly Communities of Practice) to solve problems at the team level. Teams often don’t need help from anyone with “manager” or “master” in their titles.

    Aside from trusting the teams to deliver and asking them to let you know if they can’t, I also suggest these ideas:

    • Scale the visualization of the work. How do people see what other teams or people are doing?  (I have plenty of images of kanban boards so you can see if any of those work for you.)
    • Keep the hierarchy as flat as possible so problems don’t have to go up a hierarchy, over and down, and then follow their path back before someone gets the answer they need.
    • Consider a cadence of meetings that solve problems. These meetings are not standups. Standups might expose problems but they don’t solve them.

    I recommend teams decide if they need to organize as small programs (such as above with the Engine, Admin, and Diagnostics programs). That allows a cadence of limited-participation program team meetings to solve problems the teams can’t solve.

    In addition, measure at the program level. Sure, the teams need to measure their cycle time and velocity, whatever they choose. In addition, measure the features complete at the program level, program level WIP, and any other program measures that make sense to you. (See Velocity is Not Acceleration for two of these charts.)

    Agile program management helps product development use agile approaches to release products. Next up is how to scale agile from product development to other parts of the organization.

    Categories: Project Management

    Defining “Scaling” Agile, Part 2: Program Management for Product Development

    The first post was about scaling functions to working as collaborative agile teams. See Defining “Scaling” Agile, Part 1: Creating Cross-Functional Teams. Now, let’s talk about moving to multiple teams working together, a program.

    The good news is that you have a few cross-functional teams. They’ve been delivering as project teams. And, now you have a program, a collection of several projects with one business objective.

    Programs come in a wide variety of shapes and sizes. Here are some kinds of programs:

    • You might have just one feature team and need people from Marketing or Legal to release the product. You need to bring those people into the program somehow, so they can accomplish their deliverables so the organization can release the product.
    • The project is larger than one or two feature teams. You may have several feature sets and need people from Marketing, or Legal, or Finance (or someone else) to be able to release the product.
    • You might be managing the software program, and have several feature teams or programs within the larger program. You might have the Engine program, and the Admin and Diagnostics programs. Each feature set has several teams collaborating on the code in their feature set(s). And, you probably need people across the organization to finish the work for the product. Those are the people from Marketing, Legal, Finance or others that I keep talking about.

    Programs exist when you need a little structure to organize the feature teams and/or organize the deliverables across the organization. Agile programs especially don’t need too much structure. The key is to create something that helps the people collaborate and visualize the work they need to complete.

    Here’s a way to think about scaling to a program:

    Scale the collaboration across product development to release products. 

     Scaling Collaboration Across the OrganizationYes, I wrote a book about that:  Agile and Lean Program Management: Scaling Collaboration Across the Organization.

    Here’s how I think about scaling collaboration across product development:

    • Each team thinks about how fast they can release their work to the rest of the program. (BTW, fast isn’t useful unless the work is great.)
    • Each team manages its WIP (Work in Progress) so they aren’t bottlenecking themselves or anyone else.
    • The POs work as a team so the feature teams always work on the most valuable work for the program. Sometimes, feature teams move from one feature set to another because that work is more valuable. If you’re worried about interdependencies, you might not have feature teams. Or, the POs aren’t working together. See Understand Your Project Interdependencies.
    • Teams use the power of their small-world networks (and possibly Communities of Practice) to solve problems at the team level. Teams often don’t need help from anyone with “manager” or “master” in their titles.

    Aside from trusting the teams to deliver and asking them to let you know if they can’t, I also suggest these ideas:

    • Scale the visualization of the work. How do people see what other teams or people are doing?  (I have plenty of images of kanban boards so you can see if any of those work for you.)
    • Keep the hierarchy as flat as possible so problems don’t have to go up a hierarchy, over and down, and then follow their path back before someone gets the answer they need.
    • Consider a cadence of meetings that solve problems. These meetings are not standups. Standups might expose problems but they don’t solve them.

    I recommend teams decide if they need to organize as small programs (such as above with the Engine, Admin, and Diagnostics programs). That allows a cadence of limited-participation program team meetings to solve problems the teams can’t solve.

    In addition, measure at the program level. Sure, the teams need to measure their cycle time and velocity, whatever they choose. In addition, measure the features complete at the program level, program level WIP, and any other program measures that make sense to you. (See Velocity is Not Acceleration for two of these charts.)

    Agile program management helps product development use agile approaches to release products. Next up is how to scale agile from product development to other parts of the organization.

    Categories: Project Management

    FORTIFY in Android

    Android Developers Blog - Tue, 05/23/2017 - 22:26
    Posted by George Burgess, Software Engineer

    FORTIFY is an important security feature that's been available in Android since mid-2012. After migrating from GCC to clang as the default C/C++ compiler early last year, we invested a lot of time and effort to ensure that FORTIFY on clang is of comparable quality. To accomplish this, we redesigned how some key FORTIFY features work, which we'll discuss below.

    Before we get into some of the details of our new FORTIFY, let's go through a brief overview of what FORTIFY does, and how it's used.

    What is FORTIFY?
    FORTIFY is a set of extensions to the C standard library that tries to catch the incorrect use of standard functions, such as memset, sprintf, open, and others. It has three primary features:

    • If FORTIFY detects a bad call to a standard library function at compile-time, it won't allow your code to compile until the bug is fixed.
    • If FORTIFY doesn't have enough information, or if the code is definitely safe, FORTIFY compiles away into nothing. This means that FORTIFY has 0 runtime overhead when used in a context where it can't find a bug.
    • Otherwise, FORTIFY adds checks to dynamically determine if the questionable code is buggy. If it detects bugs, FORTIFY will print out some debugging information and abort the program.

    Consider the following example, which is a bug that FORTIFY caught in real-world code:

    struct Foo {
        int val;
        struct Foo *next;
    };
    void initFoo(struct Foo *f) {
        memset(&f, 0, sizeof(struct Foo));
    }
    
    FORTIFY caught that we erroneously passed &f as the first argument to memset, instead of f. Ordinarily, this kind of bug can be difficult to track down: it manifests as potentially writing 8 bytes extra of 0s into a random part of your stack, and not actually doing anything to *f. So, depending on your compiler optimization settings, how initFoo is used, and your project's testing standards, this could slip by unnoticed for quite a while. With FORTIFY, you get a compile-time error that looks like:

    /path/to/file.c: call to unavailable function 'memset': memset called with size bigger than buffer
        memset(&f, 0, sizeof(struct Foo));
        ^~~~~~
    
    For an example of how run-time checks work, consider the following function:

    // 2147483648 == pow(2, 31). Use sizeof so we get the nul terminator,
    // as well.
    #define MAX_INT_STR_SIZE sizeof("2147483648")
    struct IntAsStr {
        char asStr[MAX_INT_STR_SIZE];
        int num;
    };
    void initAsStr(struct IntAsStr *ias) {
        sprintf(ias->asStr, "%d", ias->num);
    }
    
    This code works fine for all positive numbers. However, when you pass in an IntAsStr with num <= -1000000, the sprintf will write MAX_INT_STR_SIZE+1 bytes to ias->asStr. Without FORTIFY, this off-by-one error (that ends up clearing one of the bytes in num) may go silently unnoticed. With it, the program prints out a stack trace, a memory map, and will abort with a core dump.

    FORTIFY also performs a handful of other checks, such as ensuring calls to open have the proper arguments, but it's primarily used for catching memory-related errors like the ones mentioned above.
    However, FORTIFY can't catch every memory-related bug that exists. For example, consider the following code:

    __attribute__((noinline)) // Tell the compiler to never inline this function.
    inline void intToStr(int i, char *asStr) { sprintf(asStr, “%d”, num); }
    
    
    char *intToDupedStr(int i) {
        const int MAX_INT_STR_SIZE = sizeof(“2147483648”);
        char buf[MAX_INT_STR_SIZE];
        intToStr(i, buf);
        return strdup(buf);
    }
    
    Because FORTIFY determines the size of a buffer based on the buffer's type and—if visible—its allocation site, it can't catch this bug. In this case, FORTIFY gives up because:

    • the pointer is not a type with a pointee size we can determine with confidence because char * can point to a variable amount of bytes
    • FORTIFY can't see where the pointer was allocated, because asStr could point to anything.

    If you're wondering why we have a noinline attribute there, it's because FORTIFY may be able to catch this bug if intToStr gets inlined into intToDupedStr. This is because it would let the compiler see that asStr points to the same memory as buf, which is a region of sizeof(buf) bytes of memory.

    How FORTIFY works
    FORTIFY works by intercepting all direct calls to standard library functions at compile-time, and redirecting those calls to special FORTIFY'ed versions of said library functions. Each library function is composed of parts that emit run-time diagnostics, and—if applicable—parts that emit compile-time diagnostics. Here is a simplified example of the run-time parts of a FORTIFY'ed memset (taken from string.h). An actual FORTIFY implementation may include a few extra optimizations or checks.

    _FORTIFY_FUNCTION
    inline void *memset(void *dest, int ch, size_t count) {
        size_t dest_size = __builtin_object_size(dest);
        if (dest_size == (size_t)-1)
            return __memset_real(dest, ch, count);
        return __memset_chk(dest, ch, count, dest_size);
    }
    
    In this example:

    • _FORTIFY_FUNCTION expands to a handful of compiler-specific attributes to make all direct calls to memset call this special wrapper.
    • __memset_real is used to bypass FORTIFY to call the "regular" memset function.
    • __memset_chk is the special FORTIFY'ed memset. If count > dest_size, __memset_chk aborts the program. Otherwise, it simply calls through to __memset_real.
    • __builtin_object_size is where the magic happens: it's a lot like size sizeof, but instead of telling you the size of a type, it tries to figure out how many bytes exist at the given pointer during compilation. If it fails, it hands back (size_t)-1.

    The __builtin_object_size might seem sketchy. After all, how can the compiler figure out how many bytes exist at an unknown pointer? Well... It can't. :) This is why _FORTIFY_FUNCTION requires inlining for all of these functions: inlining the memset call might make an allocation that the pointer points to (e.g. a local variable, result of calling malloc, …) visible. If it does, we can often determine an accurate result for __builtin_object_size.

    The compile-time diagnostic bits are heavily centered around __builtin_object_size, as well. Essentially, if your compiler has a way to emit diagnostics if an expression can be proven to be true, then you can add that to the wrapper. This is possible on both GCC and clang with compiler-specific attributes, so adding diagnostics is as simple as tacking on the correct attributes.

    Why not Sanitize?
    If you're familiar with C/C++ memory checking tools, you may be wondering why FORTIFY is useful when things like clang's AddressSanitizer exist. The sanitizers are excellent for catching and tracking down memory-related errors, and can catch many issues that FORTIFY can't, but we recommend FORTIFY for two reasons:

    • In addition to checking your code for bugs while it's running, FORTIFY can emit compile-time errors for code that's obviously incorrect, whereas the sanitizers only abort your program when a problem occurs. Since it's generally accepted that catching issues as early as possible is good, we'd like to give compile-time errors when we can.
    • FORTIFY is lightweight enough to enable in production. Enabling it on parts of our own code showed a maximum CPU performance degradation of ~1.5% (average 0.1%), virtually no memory overhead, and a very small increase in binary size. On the other hand, sanitizers can slow code down by well over 2x, and often eat up a lot of memory and storage space.

    Because of this, we enable FORTIFY in production builds of Android to mitigate the amount of damage that some bugs can cause. In particular, FORTIFY can turn potential remote code execution bugs into bugs that simply abort the broken application. Again, sanitizers are capable of detecting more bugs than FORTIFY, so we absolutely encourage their use in development/debugging builds. But the cost of running them for binaries shipped to users is simply way too high to leave them enabled for production builds.

    FORTIFY redesign
    FORTIFY's initial implementation used a handful of tricks from the world of C89, with a few GCC-specific attributes and language extensions sprinkled in. Because Clang cannot emulate how GCC works to fully support the original FORTIFY implementation, we redesigned large parts of it to make it as effective as possible on clang. In particular, our clang-style FORTIFY implementation makes use of clang-specific attributes and language extensions, as well as some function overloading (clang will happily apply C++ overloading rules to your C functions if you use its overloadable attribute).

    We tested hundreds of millions of lines of code with this new FORTIFY, including all of Android, all of Chrome OS (which needed its own reimplementation of FORTIFY), our internal codebase, and many popular open source projects.

    This testing revealed that our approach broke existing code in a variety of exciting ways, like:
    template <typename OpenFunc>
    bool writeOutputFile(OpenFunc &&openFile, const char *data, size_t len) {}
    
    bool writeOutputFile(const char *data, int len) {
        // Error: Can’t deduce type for the newly-overloaded `open` function.
        return writeOutputFile(&::open, data, len);
    }
    
    and
    struct Foo { void *(*fn)(void *, const void *, size_t); }
    void runFoo(struct Foo f) {
        // Error: Which overload of memcpy do we want to take the address of?
        if (f.fn == memcpy) {
            return;
        }
        // [snip]
    }
    
    

    There was also an open-source project that tried to parse system headers like stdio.h in order to determine what functions it has. Adding the clang FORTIFY bits greatly confused the parser, which caused its build to fail.

    Despite these large changes, we saw a fairly low amount of breakage. For example, when compiling Chrome OS, fewer than 2% of our packages saw compile-time errors, all of which were trivial fixes in a couple of files. And while that may be "good enough," it is not ideal, so we refined our approach to further reduce incompatibilities. Some of these iterations even required changing how clang worked, but the clang+LLVM community was very helpful and receptive to our proposed adjustments and additions, such as:


    We recently pushed it to AOSP, and starting in Android O, the Android platform will be protected by clang FORTIFY. We're still putting some finishing touches on the NDK, so developers should expect to see our upgraded FORTIFY implementation there in the near future. In addition, as we alluded to above, Chrome OS also has a similar FORTIFY implementation now, and we hope to work with the open-source community in the coming months to get a similar implementation* into glibc, the GNU C library.

    * For those who are interested, this will look very different than the Chrome OS patch. Clang recently gained an attribute called diagnose_if, which ends up allowing for a much cleaner FORTIFY implementation than our original approach for glibc, and produces far prettier errors/warnings than we currently can. We expect to have a similar diagnose_if-powered implementation in a later version of Android.
    Categories: Programming

    Quote of the Day

    Herding Cats - Glen Alleman - Tue, 05/23/2017 - 22:24

    It isn't only art that's incompatible with happiness; it's also science. Science is dangerous; we have to keep it most carefully chained and muzzled.
    − Mustafa Mond, Brave New Worlld, Aldous Huxley, 1932

    Related articles Architecture -Center ERP Systems in the Manufacturing Domain IT Risk Management Why Guessing is not Estimating and Estimating is not Guessing
    Categories: Project Management

    Group Messaging in Android Auto

    Android Developers Blog - Tue, 05/23/2017 - 21:48
    Posted by David Nelloms, Software Engineer Communicating with a group of people is a common use case for many messaging apps. However, it may be difficult to know how the Android Auto messaging API applies to group conversations. Here are some tips for getting started with group messaging in Android Auto:

    Conversation Name

    When constructing the UnreadConversation builder, you are required to pass in a name. This is the name of the conversation that is displayed to the user when messages arrive.

    UnreadConversation.Builder unreadConvBuilder =
        new UnreadConversation.Builder(conversationName)
            .setReadPendingIntent(msgHeardPendingIntent)
            .setReplyAction(msgReplyPendingIntent, remoteInput);
    

    For one-on-one conversations, this is simply the name of the other participant. For group conversations, it is best to choose one of two options for the name:

    1. Conversation title: If your app supports adding a title to group conversations, use the title for the name parameter to be consistent with your in-app experience. This field is similar to NotificationCompat.MessagingStyle#setConversationTitle.
    2. A list of participants: Build a comma-separated list of participants for the name parameter to identify the group. Note that this is read aloud by the text-to-speech system, so you may need to abbreviate the list for large groups. You should balance allowing users to uniquely identify the group with the time taken to listen to messages.
    Text to Speech Formatting

    Getting text to sound natural using a TTS system is a challenging problem. There are teams working hard to improve this, but there are steps you can take to create a better user experience with the current capabilities. The Android Auto messaging API does not yet have an option for pairing participants with individual messages in a group conversation. This is problematic for drivers when there are multiple unread messages from multiple participants in a group conversation, as the drivers cannot see which group member sent which message. One solution is to prepend the sender's name to the message whenever the sender changes so that the names are read aloud to the driver.

    CharSequence currentSender = null;
    for (Message message : myMessages) {
        StringBuilder messageText = new StringBuilder();
        CharSequence sender = message.getSender();
        // Maybe append sender to indicate who is speaking.
        if (!TextUtils.isEmpty(sender) && !sender.equals(currentSender)) {
            if (currentSender != null) {
                // Punctuation will briefly pause TTS readout between senders.
                messageText.append(". ");
            }
            currentSender = sender;
            messageText.append(sender.toString().toLowerCase(Locale.getDefault()));
            // Punctuation will separate sender from message in TTS readout.
            messageText.append(": ");
        }
        messageText.append(message.getText());
        unreadConvBuilder.addMessage(messageText.toString());
    }
    

    Some things to note about the above sample code:

    • Adding punctuation is not strictly necessary, but it can produce a more natural sounding result.
    • The sender names are converted to lowercase. This is workaround for a quirk where the TTS implementation vocalizes ". " as "dot" when preceding a capital letter on some devices.
    Get participants

    In searching for how to handle group messaging, you may have noticed UnreadConversation#getParticipants. This can be confusing as there is no mechanism to add multiple participants in the builder. The builder implementation populates the array with the conversation name passed to its constructor. Internally, Android Auto uses the singular UnreadConversation#getParticipant, which returns the first element of the participants array, to populate the title in the notification view.

    Stay tuned

    The Android Auto team is working on ways to make messaging with drivers simpler and more intuitive for app developers. Stay tuned for future updates so that you can continue to deliver a great user experience!

    Categories: Programming

    Group Messaging in Android Auto

    Android Developers Blog - Tue, 05/23/2017 - 21:48
    Posted by David Nelloms, Software Engineer Communicating with a group of people is a common use case for many messaging apps. However, it may be difficult to know how the Android Auto messaging API applies to group conversations. Here are some tips for getting started with group messaging in Android Auto:

    Conversation Name

    When constructing the UnreadConversation builder, you are required to pass in a name. This is the name of the conversation that is displayed to the user when messages arrive.

    UnreadConversation.Builder unreadConvBuilder =
        new UnreadConversation.Builder(conversationName)
            .setReadPendingIntent(msgHeardPendingIntent)
            .setReplyAction(msgReplyPendingIntent, remoteInput);
    

    For one-on-one conversations, this is simply the name of the other participant. For group conversations, it is best to choose one of two options for the name:

    1. Conversation title: If your app supports adding a title to group conversations, use the title for the name parameter to be consistent with your in-app experience. This field is similar to NotificationCompat.MessagingStyle#setConversationTitle.
    2. A list of participants: Build a comma-separated list of participants for the name parameter to identify the group. Note that this is read aloud by the text-to-speech system, so you may need to abbreviate the list for large groups. You should balance allowing users to uniquely identify the group with the time taken to listen to messages.
    Text to Speech Formatting

    Getting text to sound natural using a TTS system is a challenging problem. There are teams working hard to improve this, but there are steps you can take to create a better user experience with the current capabilities. The Android Auto messaging API does not yet have an option for pairing participants with individual messages in a group conversation. This is problematic for drivers when there are multiple unread messages from multiple participants in a group conversation, as the drivers cannot see which group member sent which message. One solution is to prepend the sender's name to the message whenever the sender changes so that the names are read aloud to the driver.

    CharSequence currentSender = null;
    for (Message message : myMessages) {
        StringBuilder messageText = new StringBuilder();
        CharSequence sender = message.getSender();
        // Maybe append sender to indicate who is speaking.
        if (!TextUtils.isEmpty(sender) && !sender.equals(currentSender)) {
            if (currentSender != null) {
                // Punctuation will briefly pause TTS readout between senders.
                messageText.append(". ");
            }
            currentSender = sender;
            messageText.append(sender.toString().toLowerCase(Locale.getDefault()));
            // Punctuation will separate sender from message in TTS readout.
            messageText.append(": ");
        }
        messageText.append(message.getText());
        unreadConvBuilder.addMessage(messageText.toString());
    }
    

    Some things to note about the above sample code:

    • Adding punctuation is not strictly necessary, but it can produce a more natural sounding result.
    • The sender names are converted to lowercase. This is workaround for a quirk where the TTS implementation vocalizes ". " as "dot" when preceding a capital letter on some devices.
    Get participants

    In searching for how to handle group messaging, you may have noticed UnreadConversation#getParticipants. This can be confusing as there is no mechanism to add multiple participants in the builder. The builder implementation populates the array with the conversation name passed to its constructor. Internally, Android Auto uses the singular UnreadConversation#getParticipant, which returns the first element of the participants array, to populate the title in the notification view.

    Stay tuned

    The Android Auto team is working on ways to make messaging with drivers simpler and more intuitive for app developers. Stay tuned for future updates so that you can continue to deliver a great user experience!

    Categories: Programming

    Announcing the fourth class of Launchpad Accelerator featuring new countries!

    Google Code Blog - Tue, 05/23/2017 - 18:26
    .container0 { display: flex; justify-content: left; align-items: stretch; width: 100% background: black; background-color: black; margin: 0 0 10px 0; } .item0 { text-align: left; background: black; color: white; margin: 0 0 0 10px; } .container { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; align-content: space-around: width: 100% } .item1 { width: 15%; margin: 0px 0px 0px 0px; padding: 0 0 0 0; align-items: center; text-align: center; } .item1 img { margin: 0; padding: 0; object-fit: contain; } .item2 { width: 75%; } Posted by Roy Glasberg, Global Lead, Launchpad Program & Accelerator

    We're back at it again and excited to welcome an inspiring group of startups from all over the world for the 4th class of Launchpad Accelerator.

    This time around, startups from Asia and Latin America will be joined by peers from Africa and Europe. In addition to expanding our reach, we’re also expanding our curriculum. We’ll help the startups dig deeper into machine learning and AI, to help them leverage Google’s latest technologies to scale their apps.

    Launchpad Accelerator includes intensive mentoring from 20+ Google teams, and expert mentors from top technology companies and VCs in Silicon Valley. Participants receive equity-free support, credits for Google products, and continue to work closely with Google back in their home country during the 6-month program.

    Class 4 kicks off July 17th, 2017 at the Google Developers Launchpad Space in San Francisco and will include 2 weeks of all-expense-paid training.

    Here's the full list of participating startups (by region):

    Africa

    Kenya

      Twiga Foods Ltd: A tech-enabled sourcing and distribution platform that replaces informal wholesale markets for the millions of small and medium size food and FMCG retailers in Africa's urban markets.

    Nigeria
      Gidi Mobile Limited: gidimo is a mobile learning platform that uses mastery learning & social gamification to deliver personal advancement, in a fun way, and at unprecedented scale
      Flutterwave: Flutterwave is building technology and infrastructure for digital commerce across Africa starting with Rave, an app that helps merchants accept mobile money, cards and bank account payments across 4 African countries.
      Paystack: We help businesses in Africa accept payments from their customers.

    South Africa

      JUMO Marketplace: Jumo is the largest scale, lowest cost financial services marketplace for emerging markets

    Asia

    India

      EdGE Networks: HR solutions provider powered by Artificial Intelligence
      FastFilmz: The Super App for Super Fans of South Indian movies!
      IndiaLends: Credit underwriting and analytics platform for unsecured consumer lending
      RailYatri: Intelligent, big data platform that leverages crowd-sourced content to help long distance travelers
      RecipeBook: Intelligent solutions in food and retail powered by deep learning computer vision
      SigTuple: Smart screening solutions powered by data driven intelligence

    Indonesia
      Cicil: We allow Indonesian university students to purchase items online, and pay for them in monthly installments without a credit card!
      NADIPOS: Restaurant Management Platform helping simplify operations and analytics
      SIRCLO: Empowering businesses to sell online
    Malaysia
      HealthMetrics: Assisting companies managing their employee health benefits efficiently and cost effectively
    Philippines
      BLOOM: Transforming remittance businesses with blockchain technology
      Honesty Apps: A Do-it-yourself mobile application platform for both iOS and Android
    Thailand
      Piggipo: An application that helps users manage and monitor credit card spending more easily and effectively
      QueQ: Helps users manage time more wisely at crowded places
    Vietnam
      eDoctor: Allows users to consult doctors anytime, anywhere

    Europe

    Czech Republic

      Gamee: A social gaming platform
      Spendee: Helps users understand their finances
    Hungary
      PublishDrive: Intelligent SaaS enabled ebook publishing platform to increase sales globally
    Poland
      DrOmnibus: Multimedia tools that support special needs education and therapy for children with developmental and behavioral disorders

    Latin America

    Argentina

      Increase: Simplifies and modernizes how merchants and companies understand, control and manage their income.
    Brazil
      Arquivei: Empowers companies with smart data from fiscal documents fetch & analysis
      Contabilizei: Tax reporting and accounting SaaS for small businesses in Brazil
      Contratado.ME: The marketplace that puts candidates at the center of their job search
    Chile
      ComparaOnline: The best and the most transparent marketplace for financial products in Latin America
    Mexico
      Switch: Low cost, mobile bill pay

    Categories: Programming

    Listener Survey

    Dear SE Radio listener, To help make the show even stronger, we’re conducting a short survey and would very much appreciate two minutes of your time to help. www.ieee.org/seradio Thanks for your support, The SE Radio Team
    Categories: Programming

    Sponsored Post: Etleap, Pier 1, Aerospike, Loupe, Clubhouse, Stream, Scalyr, VividCortex, MemSQL, InMemory.Net, Zohocorp

    Who's Hiring? 
    • Pier 1 Imports is looking for an amazing Sr. Website Engineer to join our growing team!  Our customer continues to evolve the way she prefers to shop, speak to, and engage with us at Pier 1 Imports.  Driving us to innovate more ways to surprise and delight her expectations as a Premier Home and Decor retailer.  We are looking for a candidate to be another key member of a driven agile team. This person will inform and apply modern technical expertise to website site performance, development and design techniques for Pier.com. To apply please email cmwelsh@pier1.com. More details are available here.

    • Etleap is looking for Senior Data Engineers to build the next-generation ETL solution. Data analytics teams need solid infrastructure and great ETL tools to be successful. It shouldn't take a CS degree to use big data effectively, and abstracting away the difficult parts is our mission. We use Java extensively, and distributed systems experience is a big plus! See full job description and apply here.

    • Advertise your job here! 
    Fun and Informative Events
    • DBTA Roundtable OnDemand Webinar: Leveraging Big Data with Hadoop, NoSQL and RDBMS. Watch this recent roundtable discussion hosted by DBTA to learn about key differences between Hadoop, NoSQL and RDBMS. Topics include primary use cases, selection criteria, when a hybrid approach will best fit your needs and best practices for managing, securing and integrating data across platforms. Brian Bulkowski, CTO and Co-founder of Aerospike, presented along with speakers from Cask Data and Splice Machine. View now.

    • Advertise your event here!
    Cool Products and Services
    • A note for .NET developers: You know the pain of troubleshooting errors with limited time, limited information, and limited tools. Log management, exception tracking, and monitoring solutions can help, but many of them treat the .NET platform as an afterthought. You should learn about Loupe...Loupe is a .NET logging and monitoring solution made for the .NET platform from day one. It helps you find and fix problems fast by tracking performance metrics, capturing errors in your .NET software, identifying which errors are causing the greatest impact, and pinpointing root causes. Learn more and try it free today.

    • Etleap provides a SaaS ETL tool that makes it easy to create and operate a Redshift data warehouse at a small fraction of the typical time and cost. It combines the ability to do deep transformations on large data sets with self-service usability, and no coding is required. Sign up for a 30-day free trial.

    • InMemory.Net provides a Dot Net native in memory database for analysing large amounts of data. It runs natively on .Net, and provides a native .Net, COM & ODBC apis for integration. It also has an easy to use language for importing data, and supports standard SQL for querying data. http://InMemory.Net

    • www.site24x7.com : Monitor End User Experience from a global monitoring network. 

    • Working on a software product? Clubhouse is a project management tool that helps software teams plan, build, and deploy their products with ease. Try it free today or learn why thousands of teams use Clubhouse as a Trello alternative or JIRA alternative.

    • Build, scale and personalize your news feeds and activity streams with getstream.io. Try the API now in this 5 minute interactive tutorial. Stream is free up to 3 million feed updates so it's easy to get started. Client libraries are available for Node, Ruby, Python, PHP, Go, Java and .NET. Stream is currently also hiring Devops and Python/Go developers in Amsterdam. More than 400 companies rely on Stream for their production feed infrastructure, this includes apps with 30 million users. With your help we'd like to ad a few zeros to that number. Check out the job opening on AngelList.

    • Scalyr is a lightning-fast log management and operational data platform.  It's a tool (actually, multiple tools) that your entire team will love.  Get visibility into your production issues without juggling multiple tabs and different services -- all of your logs, server metrics and alerts are in your browser and at your fingertips. .  Loved and used by teams at Codecademy, ReturnPath, Grab, and InsideSales. Learn more today or see why Scalyr is a great alternative to Splunk.

    • VividCortex is a SaaS database monitoring product that provides the best way for organizations to improve their database performance, efficiency, and uptime. Currently supporting MySQL, PostgreSQL, Redis, MongoDB, and Amazon Aurora database types, it's a secure, cloud-hosted platform that eliminates businesses' most critical visibility gap. VividCortex uses patented algorithms to analyze and surface relevant insights, so users can proactively fix future performance problems before they impact customers.

    • MemSQL provides a distributed in-memory database for high value data. It's designed to handle extreme data ingest and store the data for real-time, streaming and historical analysis using SQL. MemSQL also cost effectively supports both application and ad-hoc queries concurrently across all data. Start a free 30 day trial here: http://www.memsql.com/

    • Advertise your product or service here!

    If you are interested in a sponsored post for an event, job, or product, please contact us for more information.

    Categories: Architecture

    Toward Evolutionary Software Design and Architecture

    From the Editor of Methods & Tools - Tue, 05/23/2017 - 16:27
    Projects that don’t change are the ones that get canceled. Any relevant and useful software has to continuously evolve. Agile development greatly emphasizes an evolutionary approach to software design and software architecture. That’s because big up-front design and architecture are risky. But the evolutionary approach also has risks. This session starts with a quick discussion […]

    Defining “Scaling” Agile, Part 1: Creating Cross-Functional Feature Teams

    I keep encountering confusion about what scaling agile is. I’m writing what I think is a 4-part series to define it so we all talk about the same thing.

    When I ask people to define what they mean by scaling agile, they talk about these possibilities:

    1. They have agile developers. They want agile testers. This is creating cross-functional agile teams for projects.
    2. They have had successful one- or two-team agile projects. Now, they’re ready for an agile program.
    3. They have agile product development (it might be called IT or Engineering or R&D or something else), and they want to share agile approaches across Marketing, Finance, HR.
    4. They want to build an entirely agile business.

    Each of these is different. Each solves a different problem for the organization. This post is about #1: the developers have been agile in their single function team. They want to bring the testers along and create cross-functional teams. (It could be the other way around where the testers are agile, but I haven’t seen that. I have seen testers using iterative and incremental approaches, but often that’s a reaction to the developers.)

    I wrote about the problem of staggered iterations in How Long Are Your Iterations, Part 1. When the developers are on a different cadence than the testers, they don’t act like a cross-functional feature team. The “team” isn’t delivering a finished feature. They’re not solving problems like a team. They often have a ton of WIP (Work in Progress). Using iterations does not make a team agile.

    On the other hand, if this is where you can start, do start there. The next part in your “scaling” of agile is to move to cross-functional feature teams. That’s where the team works together, in a collaborative fashion, to create finished features. You might do this in iterations, especially if you’ve only heard of Scrum. You might use a kanban board to see all the flow of work through your team and your bottlenecks.

    I keep talking about “your team.” Agile approaches use cross-functional teams who focus on delivering features. I’m not big on component teams. That’s because they postpone delivery of finished features. I also hate the idea (and name) of “shared services.” I’ll blog about that later.

    You might think, “The developers are agile. We’ll scale agile to the testers.” If that’s the way people think about agile in your organization, maybe that’s the best you can do. Here’s a possible reframe for you:

    Scale agile from one function to a cross-functional team.

    When you (and your managers) start to think about cross-functional teams rather than functions, you start to realize the benefits of agile.

    If you think scaling agile is sharing agile between functional teams, consider reading my upcoming book, Create Your Successful Agile Project. I’m still in editing and then it goes out for review. We expect it will be available in July.

    I do have reviewers, but if you are struggling with your agile approach, let me know if you would like to be a reviewer. We might have room for another couple of reviewers.

    Categories: Project Management

    Defining “Scaling” Agile, Part 1: Creating Cross-Functional Feature Teams

    I keep encountering confusion about what scaling agile is. I’m writing what I think is a 4-part series to define it so we all talk about the same thing.

    When I ask people to define what they mean by scaling agile, they talk about these possibilities:

    1. They have agile developers. They want agile testers. This is creating cross-functional agile teams for projects.
    2. They have had successful one- or two-team agile projects. Now, they’re ready for an agile program.
    3. They have agile product development (it might be called IT or Engineering or R&D or something else), and they want to share agile approaches across Marketing, Finance, HR.
    4. They want to build an entirely agile business.

    Each of these is different. Each solves a different problem for the organization. This post is about #1: the developers have been agile in their single function team. They want to bring the testers along and create cross-functional teams. (It could be the other way around where the testers are agile, but I haven’t seen that. I have seen testers using iterative and incremental approaches, but often that’s a reaction to the developers.)

    I wrote about the problem of staggered iterations in How Long Are Your Iterations, Part 1. When the developers are on a different cadence than the testers, they don’t act like a cross-functional feature team. The “team” isn’t delivering a finished feature. They’re not solving problems like a team. They often have a ton of WIP (Work in Progress). Using iterations does not make a team agile.

    On the other hand, if this is where you can start, do start there. The next part in your “scaling” of agile is to move to cross-functional feature teams. That’s where the team works together, in a collaborative fashion, to create finished features. You might do this in iterations, especially if you’ve only heard of Scrum. You might use a kanban board to see all the flow of work through your team and your bottlenecks.

    I keep talking about “your team.” Agile approaches use cross-functional teams who focus on delivering features. I’m not big on component teams. That’s because they postpone delivery of finished features. I also hate the idea (and name) of “shared services.” I’ll blog about that later.

    You might think, “The developers are agile. We’ll scale agile to the testers.” If that’s the way people think about agile in your organization, maybe that’s the best you can do. Here’s a possible reframe for you:

    Scale agile from one function to a cross-functional team.

    When you (and your managers) start to think about cross-functional teams rather than functions, you start to realize the benefits of agile.

    If you think scaling agile is sharing agile between functional teams, consider reading my upcoming book, Create Your Successful Agile Project. I’m still in editing and then it goes out for review. We expect it will be available in July.

    I do have reviewers, but if you are struggling with your agile approach, let me know if you would like to be a reviewer. We might have room for another couple of reviewers.

    Categories: Project Management

    Quote of the Day

    Herding Cats - Glen Alleman - Mon, 05/22/2017 - 16:08

    “One of the most dangerous forms of human error is forgetting what one is trying to achieve.” – Paul Nitze (1907–2006), SecDef 1967–1969

    Categories: Project Management

    GTAC Diversity Scholarship

    Google Testing Blog - Mon, 05/22/2017 - 15:03


    by Lesley Katzen on behalf of the GTAC Diversity Committee


    We are committed to increasing diversity at GTAC, and we believe the best way to do that is by making sure we have a diverse set of applicants to speak and attend. As part of that commitment, we are excited to announce that we will be offering travel scholarships again this year.
    Travel scholarships will be available for selected applicants from traditionally underrepresented groups in technology.

    To be eligible for a grant to attend GTAC, applicants must:
    • Be 18 years of age or older.
    • Be from a traditionally underrepresented group in technology.
    • Work or study in Computer Science, Computer Engineering, Information Technology, or a technical field related to software testing.
    • Be able to attend core dates of GTAC, November 14th - 15th 2017 in London, England.
    To apply:
    You must fill out the following scholarship formand register for GTAC to be considered for a travel scholarship.
    The deadline for submission is July 1st. Scholarship recipients will be announced on August 15th. If you are selected, we will contact you with information on how to proceed with booking travel.

    What the scholarship covers:
    Google will pay for round-trip standard coach class airfare to London for selected scholarship recipients, and 3 nights of accommodations in a hotel near the Google King's Cross campus. Breakfast and lunch will be provided for GTAC attendees and speakers on both days of the conference. We will also provide a £75.00 gift card for other incidentals such as airport transportation or meals. You will need to provide your own credit card to cover any hotel incidentals.

    Google is dedicated to providing a harassment-free and inclusive conference experience for everyone. Our anti-harassment policy can be found at:
    https://www.google.com/events/policy/anti-harassmentpolicy.html

    Categories: Testing & QA