All Posts in Agile

Aprile 21, 2020 - Commenti disabilitati su Perché è importante uno sviluppo iterativo e incrementale anche in una libreria OpenSource?

Perché è importante uno sviluppo iterativo e incrementale anche in una libreria OpenSource?

Questa è la nostra esperienza sulla realizzazione di una libreria OpenSource, di come lo sviluppo iterativo, incrementale si applichi non solo a progetti "commerciali" ma anche allo sviluppo open source, in particolare a quello guidato dalle esigenze e dal feedback.

Questa è la storia di Daikon

a dead simple and minimal framework for creating web applications in Kotlin with minimal effort

Una libreria utiizzata in molti progetti del nostro team.

La Nascita

Tutto è nato dal team in cui lavoriamo: il Team Vega e dal nostro coinvolgimento su progetti riguardanti lo sviluppo di applicazioni web in Kotlin.

Siamo stati per molto tempo dei fan di SparkJava per la sua semplicità e il suo DSL molto intuitivo.

Un'applicazione scritta in Spark è anche abbastanza semplice da testare e da manutenere, ma ci trovavamo spesso nelle condizioni di non poter usare SparkJava anche per i test.

In particolare, come spesso accade, abbiamo a che fare con servizi esterni (autenticazione, API varie, etc...), quindi nei test E2E ci piace (ove non sono disponibili i servizi veri) usare delle implementazioni che simulano il comportamento reale. Per fare questo solitamente creiamo dei test che lanciano delle API HTTP programmabili con validazioni e risposte realistiche.

Con SparkJava non possiamo lanciare più di un server HTTP nella stessa applicazione, questo perché dietro le quinte lavora con oggetti statici.

Sappiamo però che esistono librerie per soddisfare questa necessità ad esempio WireMock, ma non ci siamo mai trovati troppo bene ed in più ci forzano a configurare API HTTP in due modi diversi:
1. la libreria per il codice di produzione
2. la libreria per il codice di test.

Questo è stato uno dei motivi che hanno dato il via allo sviluppo di Daikon: avere un unico modo per lanciare più applicazioni che usano HTTP nella stessa suite di test.

In più volevamo anche qualcosa che fosse:
- rapido a partire e a servire richieste, dato che ultimamente stiamo lavorando parecchio su container docker che per loro natura sono volatili e necessitano di startup veloci.
- senza magia, ovvero la possibilità di capire facilmente come utilizzare la libreria senza magie/convenzioni che obblighino gli utilizzatori a fare mille ricerche su StackOverflow. (es: SpringBoot)

L'Evoluzione

Cosa sta dietro al concetto di iterativo-incrementale in pratica?

L'idea parte dalla necessità di trovare un modo per validare il prima possibile quello che stiamo sviluppando e capire se questo porta valore.

Per andare in questa direzione dobbiamo avere sempre qualcosa di funzionante e pronto per essere utilizzato anche se con funzionalità ridotte, grezze e migliorabili.

Non solo, gli incrementi e le raffinazioni devono essere guidate dal feedback e motivate da reali esigenze, senza speculare su quello che potrà essere o potrà avvenire nel futuro.

Oramai è qualcosa che noi in Claranet Italia diamo per scontato nella realizzazione dei progetti, ma non sempre è un concetto che viene applicato da chi sviluppa, in modo particolare nel mondo OpenSource.

A volte perché si sviluppa pensando a utilizzatori immaginari (non reali), a volte perché ci si fa prendere da manie di grandezza con il risultato di complicare il codice provando a renderlo più estensibile/configurabile/astratto, salvo poi ritrovarsi tra le mani un codice più complesso e difficile da manutenere senza una reale necessità.

In Daikon tutto (o quasi) è stato guidato dal feedback e dalla necessità.

Le prime versioni erano molto scarne: si faceva partire un' applicazione web con pochi metodi HTTP supportati, solo GET, POST e poco altro.

Man mano che usavamo Daikon nei nostri progetti, ci rendevamo conto che mancavano delle funzionalità. Quindi cercavamo di utilizzare queste reali necessità come spinta alla crescita di Daikon invece che svilupparle all'interno dei singoli progetti.

Siccome non siamo soli nell'universo, anche i feedback di colleghi, clienti e collaboratori sono stati importantissimi per capire quali funzionalità aggiungere o affinare.

Nonostante avessimo testato l'applicazione con scrupolo e il suo design sia stato fatto in TDD, niente è esente da bug. Questi feedback, quindi, ci hanno aiutato molto a trovarne alcuni (pochi per fortuna), verificarli con dei test e correggerli.

Man mano che Daikon veniva usato ci sono stati segnalati alcuni miglioramenti che avrebbero potuto semplificare il suo utilizzo e così, basandoci su necessità, feedback e uso quotidiano, abbiamo fatto la sua roadmap, fino a renderlo una libreria stabile e usata in diversi progetti in produzione.

I Traguardi Raggiunti

Uno degli obiettivi che ci eravamo prefissati era di tenere la libreria il più snella possibile. Per questo motivo abbiamo sempre cercato di evitare l'aggiunta di dipendenze. Quando qualcosa si rendeva necessario (es: parsing delle richieste e risposte in JSON) creavamo delle estensioni per Daikon che a tutti gli effetti erano progetti separati.

In questo modo l'utilizzatore ha a disposizione il set minimo di funzionalità che gli servono ed eventualmente aggiunge le estensioni alla sue dipendenze per le altre funzionalità.

Per quanto riguarda le estensioni, ci è venuto in soccorso Kotlin che, grazie alle Extension Functions, ci ha permesso di trovare un modo elegante, leggero ed espressivo per estendere il core di Daikon.

Sono nate così diverse estensioni:
* Daikon Freemarker
* Daikon Gson
* Daikon Jackson XML
* Daikon Eureka
* Daikon Prometheus

Dopo qualche tempo abbiamo iniziato a gestire anche alcuni servizi Serverless, quindi abbiamo deciso di estrarre l'intero routing nel CORE di Daikon in modo che fosse flessibile ed utilizzabile sia come server HTTP (usando Jetty) sia in Lambda che semplifica la gestione di applicazioni serverless.

Quindi è nato un altro interessante progettino: Daikon Lambda che ha la stessa interfaccia e le stesse funzionalità di base di Daikon.

Abbiamo poi deciso di estendere il concetto di semplicità e minimalismo anche al client HTTP. Così è nato anche Topinambur.

Collaborazione ed entusiasmo

Una cosa che ci è piaciuta moltissimo è stato il fatto che il Team Vega non fosse solo in questa avventura. Ai nostri colleghi è piaciuto il progetto e si sono adoperati per darci una mano a realizzare qualcosa che mancava o a migliorare quanto avevamo fatto. Ad esempio Daikon Prometheus è nato dall'esperienza in quell'ambito di un nostro collega che ha visto l'opportunità di estendere la nostra libreria con quanto conosceva.

I clienti, inoltre, si sono dimostrati da subito entusiasti del progetto, sia perché avevano a disposizione qualcosa di funzionante e semplice integrato nei loro progetti, sia perché lo hanno potuto integrare in altri loro sistemi senza difficoltà e molto velocemente. Senza contare il fatto che lo sviluppo di Daikon non aveva intaccato (se non positivamente ) la delivery del progetto.

Feedback

Daikon è un progetto in continua crescita che si evolverà ulteriormente grazie ai feedback che riceveremo. Potete contribuire in vari modi:
* usatelo e diteci come vi trovate, cosa vorreste avere in più o cosa vorreste migliorare;
* diventate contributor del progetto;
* mettete un like a questo post e una stellina al progetto su GitHub.

PS: vi siete chiesti come mai le librerie hanno nomi di vegetali? Basta nomi di animali, finalmente una libreria vegetariana!

Gennaio 11, 2018 - Commenti disabilitati su CULTURAL CONTEXT IS EVERYTHING

CULTURAL CONTEXT IS EVERYTHING

Nell'adozione di agile o delle pratiche lean, il contesto culturale è tutto. Operando nell'ambito del cambio delle organizzazioni, la cultura non è un fattore che può essere trascurato ma al tempo stesso, non è soggetto a principi di design. Matteo Carella esamina gli "errori del passato" da Toyota al modello Spotify per capire il presente e il futuro.

 

Il talk di Matteo, presentato all'ultimo AgileBusinessDay enfatizza il ruolo e il peso della cultura nell'ambito dell'adozione delle pratiche agili. Differenti culture conducono a differenti risultati, dipendentemente dal contesto. Seguono alcune note sulla cultura come fenomeno complesso, che non può essere soggetto a principi di design (banalmente come quelli della mera applicazione di processo), ma che può essere solo analizzato in base alla sua naturale disposizione (che cambia continuamente).

Considerare la cultura come qualcosa suscettibile di design o "impiantabile" comporta una serie di antipattern e misconceptions che conducono a cambi culturali poco o per nulla effettivi (es. la replica a tutti i costi del modello Toyota nelle industrie americane fino all'ossessione per il "modello Spotify" inteso erroneamente come framework piuttosto che come esempio di cultura). L'utilizzo dei rituali nell'ambito dell'organizational design e il loro significato cognitivo. Esempi di successo (Zalando e Lego®) basati su una cultura aziendale sana, radicata e spontanea.

Gennaio 10, 2018 - Commenti disabilitati su CONTINUOUS DELIVERY: DOVE SIETE E DOVE POTETE ARRIVARE?

CONTINUOUS DELIVERY: DOVE SIETE E DOVE POTETE ARRIVARE?

 

Agli ultimi Agile Days a Urbino, Joe Bew ha spiegato cosa significa fare Continuous Delivery, quali sono i passi che in modo iterativo e incrementale aiutano il team a raggiungere una maggiore consapevolezza e conoscenza sul tema, al fine di modellare il processo di rilascio software per adattarsi meglio ai requisiti di business.

Durante le sue attività di supporto ai team, Joe ha messo a punto una tecnica per fare emergere l’attuale processo di delivery per visualizzare gli impedimenti e capire quali passi compiere per visualizzare il processo corrente:

  1. expectation
  2. discover
  3. visualize
  4. redesign
  5. realize
  6. share

Grazie a questo format i vari stakeholder sono riusciti ad evidenziare eventuali roadblock e migliorare il loro processo di delivery.

Gennaio 10, 2018 - Commenti disabilitati su I TERRIBILI “GUARDIANI DELLA CODEBASE”

I TERRIBILI “GUARDIANI DELLA CODEBASE”

Spesso le persone con maggiori conoscenze tecniche e di maggiore esperienza tendono col tempo a diventare over protettive nei confronti del software che hanno costruito con tanta passione. Durante il talk dell'ultimo Agile Days, Paolo D'incau ha raccontato quali sono i principali danni che questo comportamento può arrecare in un’azienda agile e come la figura del “guardiano” possa naturalmente evolvere in un’altra figura che agisce da catalizzatore per la crescita del team.

 

 

Il talk nasce dall'osservazione sul campo di un pattern presente in tanti team dove spesso la persona con più conoscenza tecnica e di prodotto non riesce a rilasciare il controllo e far crescere le persone che ha accanto, perché teme di far abbassare la qualità della codebase.

Il tema è molto caro a Paolo, che afferma: "mi considero un guardiano della codebase "disintossicato" e ho avuto a che fare con parecchi guardiani negli ultimi anni quindi ho moltissimi esempi reali da raccontare durante il talk per guidare la discussion. Credo che in un mondo come il nostro, in cui si parla spesso di eccellenza tecnica e di craftsmanship valga la pena ricordare che alla base di un team agile c'è ben altro, come il lavoro di squadra e la crescita omogenea delle persone."

Settembre 21, 2017 - Commenti disabilitati su Refactoring e architettura emergente di un’applicazione Zeppelin

Refactoring e architettura emergente di un’applicazione Zeppelin

Condividiamo alcune esperienze sulla gestione di un progetto complesso in ambiente Apache Spark/Apache Zeppelin.

Uno dei progetti su cui il team di XPeppers ha lavorato negli ultimi mesi è stato lo sviluppo di un'applicazione di software quality dashboard per un grande gruppo bancario. Il compito dell'applicazione è fornire un pannello di controllo centralizzato attraverso cui monitorare la qualità del software rilasciato dai numerosi fornitori del gruppo. I dati da gestire sono generati da SonarQube, aggregati e rappresentati secondo logiche custom definite dal Cliente. I progetti da tenere sotto monitoring sono molti, e per ciascuno di essi si devono processare sia dati attuali che trend storici; serviva quindi una piattaforma di big data management. La scelta è stata di usare la coppia Apache Zeppelin / Apache Spark, sviluppando il codice necessario per le elaborazioni e visualizzazioni custom in Scala (per l'elaborazione dati) e AngularJS (per la UI), e usando SBT come strumento di build.

Il primo spike

La prima versione dell'applicazione è stata sviluppata in modo un po' quick & dirty: volevamo arrivare velocemente a mostrare un prototipo funzionante agli stakeholder e capire se la scelta dello stack tecnologico (e soprattutto di Zeppelin come front-end) fosse accettabile. La demo è piaciuta e ci siamo trovati con la "release 0" (ci siamo concessi un approccio "Spike and Stabilize").

Questa prima versione era costituita da una singola nota Zeppelin, suddivisa in una ventina di paragrafi, molti dei quali contenenti diverse decine di righe di codice Scala e SQL più o meno complicato. Soltanto due servizi erano forniti da classi Scala compilate separatamente: il dialogo HTTP con i Web Service di SonarQube, e la gestione di una base dati locale in formato Parquet.

noterel0

Primo refactoring

Era il momento di fare un po' di stabilize, e il problema principale della release 0 era evidente: troppo codice troppo complicato inserito nel corpo della nota Zeppelin, e quindi di gestione incredibilmente difficile (versioning quasi inutile, impossibilità di usare IDE o editor evoluti per modificarlo, ...)

Abbiamo quindi cominciato a migrare il codice dalla nota Zeppelin verso classi Scala, cogliendo l'occasione per aggiungere dove possibile test unitari (in Scalatest). Il codice ha cominciato ad assumere una forma vagamente object-oriented, anche se ancora un po' rudimentale.

La relazione fra la nota e le classi Scala importate da JARera un po' migliorata:

notes2.png

Nel frattempo il PO ha cominciato a chiedere modifiche alla nota originale, e un bel giorno le dashboard richieste sono diventate due, molto simili fra loro come layout, ma con diversi set di dati visualizzati (dati di leak period vs. dati storici per una data scelta in input). Questo è stato anche il momento in cui abbiamo agganciato per la prima volta una callback (scritta in Scala) alla GUI AngularJS della dashboard (usando il metodo angularWatch dello ZeppelinContext).

Il secondo punto di partenza

Il fatto di aver migrato una parte del codice dalla nota ai sorgenti Scala, ovviamente, si è rivelato provvidenziale nel passaggio da una a due note. Tuttavia, le due note attingevano a fonti di dati diverse (il database Parquet per la nota principale, i WS Sonar per la nuova dashboard "di leak period") e per farlo usavano metodi nati indipendentemente e collocati in classi diverse. Inoltre, entrambe le note contenevano ancora parecchio codice; andavano lente, ed erano instabili. La manutenzione e il refactoring erano sempre molto difficili. Sapevamo che le classi Scala avevano parecchi problemi (a partire da un forte difetto di SRP: avevamo 2 o 3 classi “demi-god” con decine di metodi di accesso ai dati), ma le possibilità di refactoring erano limitate dal fatto che mancavano ancora molti test unitari e prevedere/verificare le conseguenze delle modifiche sulle note era molto complesso.

Nel frattempo, erano entrate nuove richieste dal PO, tra cui una per una terza dashboard (sempre simile come layout ma diverse come logica di caricamento dati), e ogni tanto ci veniva chiesto di clonare una nota per una demo. Queste note “demo” diventavano tipicamente inutilizzabili dopo qualche settimana, perché legate a codice modificato in continuazione, e non soggette a manutenzione.

Con la terza nota avevamo una valida giustificazione per un nuovo refactoring. A questo punto era evidente che l'applicazione sarebbe stata soggetta a ulteriori evoluzioni per i mesi a venire, e che avevamo raggiunto la soglia di design payoff: per non rallentare dovevamo fermarci, e rivedere più profondamente il design.

Secondo refactoring

Nelle settimane successive non abbiamo rilasciato quasi nessuna major feature, e abbiamo lavorato sul debito tecnico, in modo mirato, fino a portare a casa due breakthrough principali:

  • abbiamo trovato un’implementazione molto più efficiente per le note, che ha reso possibile provare il funzionamento in poche decine di secondi (vs. tempi sopra la decina di minuti) e cominciare a parlare di una ten-minute build comprensiva di integration test;
  • abbiamo definito un’interfaccia comune (in effetti una classe astratta) da cui far dipendere, in modo uniforme, tutte le note, migrando faticosamente la vecchia pletora di metodi simili-ma-diversi sotto il cappello della nuova interfaccia. L’abbiamo chiamata Report (nel senso di un report Sonar).

A questo punto la differenza principale fra le diverse note consisteva nella classe concreta che veniva istanziata per popolare la nota. La “Leak Period Dashboard” istanziava un LeakPeriodReport, la “Dashboard” principale (che mostra un report riferito a una data fornita in input) istanziava un TimeReport, la “Comparative Dashboard” (che mostra un report che è il delta fra due date, una generalizzazione del concetto di leak period) istanziava un DeltaReport (dandogli in pasto in costruzione altri due Report fra cui calcolare il delta). Una cosa così:

uml1

Le differenze fra le varie dashboard non erano proprio tutte solo nell’istanziazione del Report concreto: alcune note avevano bisogno di agganciare callback e altre no, c’erano delle variazioni nelle visualizzazioni di alcuni valori, e così via. Ma eravamo arrivati a note con 3-4 paragrafi ciascuna:

  • inizializzazione delle dipendenze (con l'interpretespark.dep)
  • setup di eventuali dati specifici (per esempio, le date fra cui scegliere nelle note "temporali")
  • istanziazione di un (certo tipo) diReport
  • popolamento della dashboard a partire dal report (una serie di binding delle variabili Angular a partire dai dati forniti dalReport)
  •  eventuale aggancio di callback

Terzo refactoring

A questo punto è arrivata una richiesta del PO di tipo nuovo:

"Belle. Ora fatemele uguali anche per questi altri 4 gruppi di progetti."

Si trattava di passare da 3 dashboard (simili fra loro)... a 15!

Se non avessimo già estratto il codice dalle note nelle classi compilate, sarebbe stato un bagno di sangue (sia creare le nuove note che, soprattutto, manutenerle). In realtà le note erano già molto piccole e facilmente clonabili senza incorrere in un effort di manutenzione enorme. C’era comunque ancora un po’ di codice, e come detto sopra, alcune piccole differenze di logica (aggancio di callback, setup specifici, ecc.).

A questo punto abbiamo fatto un ultimo passo di refactoring/DRY: abbiamo spostato TUTTO il codice dalle note nelle classi Scala compilate separatamente, inclusi i binding di variabili Angular e gli altri statement che facevano uso delloZeppelinContext(per inciso, questo ha richiesto l'aggiunta di una nuova dipendenza nel nostrobuild.sbt: "org.apache.zeppelin" %% "zeppelin-spark" % "0.6.1").

Finalmente tutto il codice era gestibile via IDE e alla portata dei test unitari, e non abbiamo avuto difficoltà a fare al volo un ulteriore passo di riorganizzazione, portando a fattor comune in una classe astratta tutto il codice invariante fra le diverse note (p.es. il popolamento delle variabili Angular a partire dai valori tornati dal Report), e isolando le differenze in tre sottoclassi concrete:  BasicDashboardNote,  LeakPeriodDashboardNote, e ComparativeDashboardNote:

uml2

Su Zeppelin abbiamo lasciato solo il minimo indispensabile, ovvero due righe essenzialmente uguali in ogni nota:

val projects = z.input("Elenco dei progetti sotto analisi")
new BasicDashboardNote(z, projects)

Nota: i diagrammi sono fatti con i tool di yUML.

Settembre 15, 2017 - Commenti disabilitati su WeDoTDD: That’s How

WeDoTDD: That’s How

We recently did an interview on wedotdd.com on how we practice TDD. We decided to share our answers also in our blog, keep on reading if you want to know more!

 

Pairing in Peppers

 

History, what you do now, anything that summarises you or makes you interesting

An agile software developer at XPeppers has on average four years worth of experience in agile methodologies and has therefore grown a skillset that ranges from Clean Code and Refactoring to Test-Driven Development. Our software developers spend most of their work hours crafting customer ideas into great software.

All team members at XPeppers focus on their continuous improvement by investing time in studying new technologies and paradigms, doing katas and setting up coding dojos and presentations.

How did you learn TDD?

Each developer who joins our team has a study path to follow and has a mentor that helps them learn all the things we value most at XPeppers, among which you can obviously find TDD.

We know that TDD can be learnt only with practice and therefore we suggest katas and organise internal coding dojo during our study time to both improve our skills and share ideas. We try to teach our developers TDD "on the field" by pairing up developers who are less experienced on TDD with our XP coaches.

Our developers quickly get that TDD has a huge impact on the quality of the code they craft and easily become engaged with it. With time they understand that tests are not only a good way to avoid regressions but also a great tool to improve code design.

Tell us more about how your team pairs

At XPeppers we try to work on uniformed pairing stations that run similar software. In addition to this, we’ve noticed that large desks with big monitors encourage a more natural role and keyboard switch.

During our pair sessions we do talk a lot (hence we’re italian :P) and collaborate in order to make better design decisions and write better code in general.

Another practice we sometimes do is to pair (on site and remote) with a member of customer's team to enhance domain knowledge and share development best practices.

More Details About the Team Itself

At XPeppers every team is shaped according to customer needs and follows a project from the beginning until its delivery. Its members however, might be adjusted based on iterations and workload whereas the team ideally is cross-functional by nature. In this way we are able to enhance our focus on a specific product and share experiences throughout the team on a project based manner.

Every month we update our projects portfolio board to both assure everyone is allocated and to have a more long term view of ongoing projects.

What role does QA play on the team? How do they interact and work with the developers, Project Managers, etc.?

In some of our projects we have a QA person that tests the user stories when they are available on a production-like environment. Usually they try to replicate the requirements written in the back of the user story.

In some other projects we write an automated user acceptance test and we have a set of UAT that proves that our software works as intended (or expected) by the customer.

What kinds of products does the team support / develop?

We have huge experience on financial applications: we built both Mobile Payment Apps for iOS and Android and backend payment gateways for some of the biggest players in Italy.

We are confident with API development (lately we are working extensively with Serverless Architectures).

The XPeppers team has many other successful case studies with different customers among with you can find famous newspapers, networking companies and public institutions.

Can you describe in detail the team methodologies & workflow when developing software

Every XPeppers team has its Product Owner which talks directly with the customer to collect the requirements and other information such as some priorities including scope, time and quality. In this way the PO can better understand the real customer needs.

Then the team takes part to a KickOff meeting in order to update all the team members on projects goals, the expected results, the timing and the process.

The whole team defines the priority for each story to minimize the time spent to have a working software that can be tried and approved by the customer.

A story complexity is estimated in points based on the team experience or on a spike made before. The points are assigned following the Fibonacci scale starting from the simplest story.

We use a physical Kanban-board every time is possible. If a team is distributed we have a virtual board, even if we often reply it in a physical format for visualisation convenience.

We schedule meetings with the customer every 1 or 2 weeks to do a demo of the software and plan which stories to include in the following iteration.

In XPeppers we adopt many XP practices like Pair Programming, TDD, Code Review. We rely on the type of customer/project to choose the practices that help us to enhance the quality of the project, the development process and the relation with the customer.

Can you describe a typical / common setup of a developer machine?

A typical developer machine at XPeppers is a MacBook Pro 13' or a Dell XPS 13'. We have an IDE to work with languages like Java or C# and an editor like vim, emacs or atom.

We follow the Agile Manifesto, so we value people more than tools: this is why we try to decide as a team which configuration is best suited for a given project.

Can you explain in detail the different types of tests the team writes and in what contexts or at which levels (boundaries) of code?

We use to write different kind of tests based on the project context. Basically, using TDD, we happen to leave a trail of tests behind us, which are going to be the core of our test suite. We tend to cover the code strategically: the most important or risky is the feature, the more tests we write for that part of code. We also write integration tests, to verify the behaviour of the system (or one of its part) as a whole. Those tests are all written by developers as part of their day-to-day work. We then also write Acceptance Tests, which we use to discuss and clarify features with customers. Those are the main type of tests we write.

Just to give a concrete example, those are some numbers taken for two big-sized projects:

  • 2,500 Unit tests, running in about 30-40 seconds
  • 200 Integration tests, running in about 19-20 minutes
  • 250 Acceptance tests, written as Cucumber scenario tests, running in about 12-18 minutes against a production-like deployed application
  • 2,308 Unit tests, running in about 10-15 seconds
  • 556 Integration tests, running in about 6 minutes
  • 502 Acceptance tests, running in about 17 minutes against a production-like deployed application

Depending on the project context, we may decide to write also other type of tests, mainly smoke tests and stress tests.

What is the team's style / approach to TDD?

As a consulting company, we don't have a team style or specific approach to TDD. We'd like to see TDD as an effective practice to build working software. We try to choose the approach that best fit particular situation, team or product.

When we are working with an external team, like customers who are approaching TDD for the first time, we like to keep a smooth and very strict rhythm so that people can appreciate, learn and better understand the practice. From the other hand, we tend to shift to a faster and less strict approach when we are working with more experienced people or when the confidence about the domain is high we tend to go faster.

Explain how you refactor your tests (blue step in TDD)

We try to make a refactor step after each test pass and try to enhance code in order to embrace business changes needs or reduce technical debt.

When our application is hard to change, we know we should refactor our code.

If we cannot do it immediately (e.g. due to a short deadline) we create a card with TD (Technical Debt) label and we do it as soon as possible.

Are there any refactoring patterns or techniques that you apply to the production code?

There are different patterns that we employ everyday in order to improve the design of our production code, avoid duplication and express in a better way the intent of each component. Each person in our team has a different set of patterns in their toolbox but we try to use those that answer the four rules of simple design; anyhow most of the patterns we employ are taken from two books we warmly recommend: Refactoring by Martin Fowler and Refactoring to Patterns by Joshua Kerievsky.

How has TDD helped the team design better code?

TDD helps our teams in many ways. It allows us to see a new feature from the customer point of view.

In addition we can write more meaningful code for the business needs, which leads to have the code cleaner and more understandable for the entire team.

It permits to have a quick feedback and to not over-engineer the application, because we write only the code that is really needed.

How has TDD benefited your customers and client's projects?

Our customers feel a better quality in the software we deliver, because there are few bugs and we can fix them quickly.

The customer asks for new features with more confidence and trusts us. The software turns out to be more flexible and easier to extend.

What are some challenges the team has faced with TDD?

There are many challenges that we try to face when we practice TDD in our team, and these challenges are not only related to technical aspects but also to different approaches that come from our different experiences.

In some situations we discuss a lot about the first test we should write when developing a new feature: shall we start with this case or another? In other cases we have to think carefully on our TDD approach; of course we love outside-in TDD but sometimes when we are confident we embrace inside-out as well.

Another challenge for an experienced member of the team is to pass down some values to younger people: first of all we teach that tests are code and therefore is important to give them all the respect they deserve and polish them using refactoring techniques, DSL etc etc. Moreover tests are made to be read by other people (not always technician) and we must try to make them as much expressive as we can.

Please provide more details on your CI environment or CI environments of the clients you support

The continuous integration environment heavily reflects the project itself. Its complexity and automation degree tell us what kind of environment to spin-up in order to be more effective and productive on a daily basis. We’ve used different tools in the past including Jenkins, GitlabCI, Travis, CodeShip, CircleCI, DroneCI for backend and frontend development. Bitrise and Buddybuild for mobile applications. At XPeppers, we prefer a streamlined continuous deployment or delivery approach to push artefacts towards production.

Please provide more details on your apprenticeship program, internships or on-boarding process

At XPeppers we provide either apprenticeship and internships programs. Both have a strong focus on learning the core principles, values and practices of our way of working.  Apprentices are given the chance to deepen their understanding of eXtreme Programming, Clean Code and TDD by following an ad hoc tailored version of our study path with the support from the entire team.

On-boarding is another very important aspect that helps newcomers to become first-class XPeppers citizens. The on-boarding process is made up of activities other than simply studying, ranging from learning our culture, presenting their progress to others and joining all daily team activities.

How does the team continually learn and improve their TDD and general code design skills?

Each team member at XPeppers has an ad hoc study path to improve both soft and technical skills continuously. We spend a certain amount of time each day to follow this path and to share know how with other team members by making presentations, pair programming sessions and other team activities that help us grow.

Do you talk about TDD with candidates during interviews?

During our interviews at XPeppers we usually ask the candidate whether or not he/she has familiarity with practices such as TDD. If so, we ask further technical information about the subject and adopt TDD during subsequent exercises and pair programming sessions. If it turns out that the candidate has never done nor seen test driven development before, we try to understand how willing the candidate is to learn and improve his/her knowledge of our practices.

Maggio 16, 2017 - Commenti disabilitati su Il continuous improvement inizia dalle persone

Il continuous improvement inizia dalle persone

In questo blog post vogliamo mettere in evidenza uno dei valori più importanti all’interno di XPeppers: il miglioramento continuo. Un valore che si può percepire già dai primi giorni di esperienza lavorativa, momento in cui i nuovi arrivati iniziano a seguire un percorso di studio mirato all’approfondimento dei principi e dei valori condivisi dal team, tra cui tematiche legate ai metodi agili e ad extreme programming.

Kata in progress!

In questo percorso c’è la figura di un tutor aziendale, una persona del team che affianca e segue il nuovo arrivato durante un primo periodo, fornendo feedback e consigli su come affrontare nel modo migliore i temi trattati. Oltre a questa figura di riferimento, si può sempre contare su un ulteriore supporto dal resto del team.

Il nostro percorso di studio è organizzato in aree tematiche che coprono i concetti più importanti delle metodologie agili e tutte quelle buone pratiche per scrivere codice migliore. Studiamo dai libri, dai blog e da altre risorse che riteniamo valide, alternando la teoria alla pratica. Affiancandoci a qualche altra persona del team svolgiamo e ripetiamo esercizi di programmazione, detti Kata, per rendere il più naturale possibile l’apprendimento dei temi studiati e la loro applicazione su progetti reali.

Una volta completato questo percorso, in XPeppers continua ad essere presente come pratica quotidiana il cosiddetto “pomodoro di studio”, momento in cui ogni giorno ciascuno di noi dedica del tempo all’approfondimento di argomenti che crediamo importanti per la nostra crescita professionale. Quando lo riteniamo opportuno organizziamo anche presentazioni interne per cercare feedback e condividere tematiche rilevanti col resto del team.

Per nostra natura ci piace raccogliere feedback e cercare di migliorarci continuamente, e questo si riflette anche sul nostro percorso di studio che continua a cambiare nel tempo per rimanere al passo con le tematiche emergenti.

Se anche tu come noi credi al miglioramento continuo, sei curioso e pensi che il nostro metodo e percorso di studio possano farti crescere allora continua a seguirci o mandaci la tua candidatura!

Marzo 6, 2017 - Commenti disabilitati su “How Agile Dev Teams work” – Our seminar @ICTDays 2017

“How Agile Dev Teams work” – Our seminar @ICTDays 2017

seminar picture

Last Thursday, in a joint effort with Paros s.r.l., we held a seminar at the department of Information Engineering and Computer Science at the University of Trento.

It was the final event of the day for the 2nd of March and a part of the ICTDays program, which is a set of activities spanning across a couple of weeks, organized to facilitate the meeting between Tech companies and Information Technology students that are looking for career opportunities.

We have worked with the Paros team for a cumulative period of almost three years now, and we were looking to share our experience and introduce the attending students to what an Agile transformation may look like - maybe in a company they could be working for in a few years (or months) from now.
(You will be able to read more about our successful collaboration with Paros in an upcoming and more comprehensive case study, so be sure to keep up to date with our latest news!)

The Seminar:

After a brief intro about the Agile principles and manifesto, we talked about the "old way" of doing things.
No shared knowledge about the product, long requirement gathering cycles, impossibly complicated deployment procedures, very few opportunities for growth... You name it.
We then proceeded to illustrate how XPeppers and Paros started their collaboration. One step at a time, it managed to change the company culture, leveraging on the work of both teams.
This introduced a long series of benefits, starting from a collective code ownership of the development team to a deeper commitment to the product across all departments - simply a more efficient process all around.
In particular, we focused on the introduction of Scrum, which allowed us to focus on creating business value: rather than planning in terms of technical considerations, such as software layers, this framework helped the team to plan in terms of benefits for the customers and their final users.
The following step was introducing technical practices taken from Extreme Programming, like TDD, Continuous Integration, Refactoring, which allowed the team to develop the kind of technical excellence needed to be able to release early, often and continuously.

You can look at our slides here!

https://docs.google.com/presentation/d/1pyRu8DJr05iFzIazOUs4HJuZ7_osMs_p-Ua_8VsFoKw/edit?usp=sharing

What we have learned:

At the end of the talk, we had the chance to answer interesting questions from the students spanning across a wide range of subjects: from the technical, down to earth stuff to the most abstract concepts addressed by our process.

It was a very stimulating experience and a chance to take a fresh look at our company environment from the perspective of young, newly trained people.
We are definitely looking forward to more opportunities like this one, where we get to keep in touch with the emerging professionals in our field.

If you were attending our seminar, please let us know your feedback and any questions you may have left by contacting us through our website.
We'd love to hear from you!

Febbraio 20, 2017 - Commenti disabilitati su Hiring Great People – come abbiamo migliorato il nostro processo di recruitment

Hiring Great People – come abbiamo migliorato il nostro processo di recruitment

hiring

Attirare e selezionare le persone giuste consente di costruire un grande team, di farlo crescere in salute, mantenendo e consolidando la propria cultura aziendale.
Eppure troppo spesso il processo di recruitment è sottovalutato o demandato quasi interamente al reparto HR o a società esterne.

Nella sessione dell'agile day del 2015 Pietro Di Bello ha raccontato il processo di recruitment che nel corso degli anni abbiamo messo a punto, di quali siano gli aspetti che valutiamo più importanti, dell’importanza di coinvolgere pienamente il team in questo percorso, facendo anche un confronto con i metodi di selezione “tradizionali”.

Si tratta ovviamente di un percorso mai fisso: il processo di recruitment può e deve cambiare ed adattarsi al crescere dell’azienda. E come tale pone sempre nuove sfide, che vorrei raccontarvi, sia di quelle vinte che di quelle perse.

Le slides della presentazione

 

Se vuoi provare dal vivo il nostro processo di recruitment, invia la tua candidatura dalla pagina di carriere.

Febbraio 13, 2017 - Commenti disabilitati su Case Study PhotoVogue

Case Study PhotoVogue

Photovogue

Nata come società di stampa, al giorno d'oggi la maggior parte dei contenuti di Condé Nast è distribuita attraverso canali digitali, per cui sono necessari la stabilità delle piattaforme di distribuzione e la flessibilità della tecnologia.

PhotoVogue, parte del marchio Vogue, è una piattaforma per i fotografi che vogliono mostrare il loro talento con la possibilità di partecipare a mostre internazionali e iniziative e la possibilità di essere rappresentato da un'agenzia di New York Art + Commerce, una delle più prestigiose al mondo.
La piattaforma, lanciata nel 2011, aveva bisogno di un importante aggiornamento della tecnologia per supportare la crescita costante. Nel corso del kickoff del progetto il team ha deciso di sfruttare tutte le tecnologie all'avanguardia fornite da Amazon.

Abbiamo partecipato all’implementazione nel corso di un periodo di tempo di tre mesi, portando l'adozione di metodologie agili e le operazioni automation di infrastruttura. Amazon ha realizzato un case study sul progetto.

La soluzione

serverless architecture

  • AWS Lambda abilita la scalabilità automatica in base al traffico di PhotoVogue to scale.
  • Il Web Client di PhotoVogue utilizza le API REST costruite con AWS Lambda e AWS API Gateway.
  • Gli utenti possono caricare le loro foto utilizzando la funzionalità delle S3 Pre-Signed URLs.
  • AWS S3 scatena una AWS Lambda function che converte la foto caricata dall'utente in vari formati.
  • AWS RDS con MySQL sono usati come servizio di database.
  • AWS CloudFront è usata come content delivery network per i contenuti.
  • AWS API Gateway è usato come layer di caching per le API rest.

Leggi il case study: https://aws.amazon.com/solutions/case-studies/photovogue/