SlideShare a Scribd company logo
Edition of an Enterprise Software in PHP
NICOLAS DUPONT @duponico #forumphp joind.in/15714
NICOLAS DUPONT
Co-founder & Lead Developer
@duponico
nidup
agile software dev, continuous
improvement, open source, beers.
ENTERPRISE SOFTWARE
Solves an enterprise-wide problem
Improves the productivity
Is robust and reliable
For instance, Enterprise Resource Planning (ERP), Business Intelligence (BI), Customer
Relationship Management (CRM), Business Process Management (BPM), Master Data
Management (MDM), etc
PRODUCT INFORMATION MANAGEMENT (PIM)
COMMUNITY & ENTERPRISE EDITIONS
Symfony 2.7 Full Stack
+ Community Bundles
Open Source license, free of charge
Symfony 2.7 Full Stack
+ Community Bundles
+ Enterprise Bundles
+ SLA-backed support
Commercial license, annual subscription fee
25k+ installations
134k LoC (PHP)
60+ customers
134k LoC + 49k LoC (PHP)
FEW ENTERPRISE CUSTOMERS
Clothing &
Accessories
Retailers Service Specialist
Retailers
Others
... ... ... ... ...
ECOSYSTEM
Akeneo 40+
people
Edition
Solution
Partners
25+
companies
Integration
Community 2500+
people
Contribution
... 160+ countries
KICK OFF
Timeline [01/13] ... 06/13 ...
Akeneo Team 4
Product Team 2
Community Edition starting (0 LoC)
Enterprise Edition not started
WHY PHP?
Strong community
Open source friendly
Good libraries (ex: thephpleague)
More and more mature (ex: composer)
Easy to hire for our partners
WHY SYMFONY (FULL STACK)?
Proven Framework
Strong community
Good documentation
Guidelines/practises
Speed up the development
BUSINESS APPLICATION NEEDS
UI (navigation, grid, etc)
User
Security
Workflow
Reporting
...
Common requirements
Same needs than OroCRM
Let's contribute to
FIRST DIFFICULTIES
Few months later...
Lot of technical pieces started...
Nothing 100% finished,
Nothing 100% useable
NEW ORGANIZATION!
Product owner joins the team
Scrum team (2 weeks / sprint)
Focus on business value
Focus on finished increments
Focus on technical practises
RESPONSIBILITIES
Product Owner
Build the right thing
Developer
Build the thing right
Agile coach
Build the thing fast
ALPHA RELEASE!
Timeline 01/13 ... [06/13] ... 01/14 ...
Akeneo Team 7 (+3)
Product Team 5 (+3)
Community Edition v1.0.0-alpha (39k LoC)
Enterprise Edition not started
FIRST PROJECTS
We integrate a first project on v1.0.0-alpha
Solution partners integrate few others
Integration? standard distrib, write custom import and export, add
extra models, write specific business rules, create new screens, etc
Problems! extensibility, unclear naming, lake of interfaces, too
much responsibilities per class, etc
CUSTOMIZABLE+MAINTAINABLE
SOLID OOP principles
+ Dependency Injection Container
+ Unit Tests
+ Functional Tests
= Easy to change any small part of the app
PhpMetric, size = Complexity,
color = Maintainability
pim_catalog.updater.product_property_setter:
    class: %pim_catalog.updater.product_property_setter.class%
    arguments:
        ­ '@pim_catalog.repository.cached_attribute'
        ­ '@pim_catalog.updater.setter.registry'
    
UNIT TESTS
1) Describe a class behavior
2) Implement the behavior
3) Refactor the code
>> Helps to specify and design classes
Today, ~1000 specs
        class ProductBuilderSpec extends ObjectBehavior
        {//[...]
        function it_creates_product_without_family($repository, AttributeInterface $sku)
        {
        $repository­>getIdentifier()­>willReturn($sku);
        $this­>createProduct()­>shouldReturnAnInstanceOf(self::PRODUCT_CLASS);
        }//[...]
    
FUNCTIONAL TESTS
1) Describe a feature
2) Implement it
>> Helps to specify features
today, ~1400 scenarios
Feature: Edit a product
    [...]
    Scenario: Successfully edit and save a product
        Given I am logged in as "Mary"
        And I am on the "sandal" product page
        And I fill in the following information:
            | Name | My Sandal |
        When I press the "Save" button
        Then I should be on the product "sandal" page
        And the product Name should be "My Sandal"
    
CONTINUOUS INTEGRATION
Jenkins CI
Static analysis (phpmd, phpcs, phpcpd, jshint, etc)
Unit Tests (phpspec, jasmine)
Functional + API Tests (behat) Jenkins CI
Travis CI
Static analysis + Unit Tests
Github Integration Travis CI
CODE WORKFLOW (GIT)
For each story / bug,
Create a new branch
Write code + tests
Do a pull request
Check the Definition Of Done (DOD)
Merge
Definition Of Done (Story)
| Q                     | A
| ­­­­­­­­­­­­­­­­­­­­­ | ­­­
| Specs                 |
| Behats                |
| Blue CI               |
| Changelog updated     |
| Code review and 2 GTM |
| Micro Demo (PO)       |
| Migration script      |
| Tech Doc              |
    
STABLE RELEASE!
Timeline ... 06/13 ... [01/14] ... 04/14 ...
Akeneo Team 9 (+2)
Product Team 5 (=)
Community Edition v1.0.0 (62k LoC)
Enterprise Edition not started
COMMUNITY EDITION V1.0.0
Hard to release the first stable version
Why? very last change, postpone, another one, etc
So? ~2 months to "finish"
Lot of new projects (and problems)!
"If you are not embarrassed by the first version of your product, you’ve launched too late."
Reid Hoffman
PERFORMANCE PROBLEM
Customer with 100k products, 100 attributes
Application is slow (grids, forms)...
Why? Doctrine ORM hydration + greedy algo
So? ~1 month to optimize the code
SCALABILITY PROBLEM
Customer with 1M+ products
Application will not work...
Why? RDBMS + Entity Attribute Value (EAV)
So? ~1 month to add a MongoDB storage + minor release
LET'S START THE ENTERPRISE EDITION!
Timeline ... 01/14 ... [04/14] ... 11/14 ...
Akeneo Team 12 (+3)
Product Team 5 (=)
Community Edition v1.1.0 (67k LoC)
Enterprise Edition starting
NOT STARTED, ALREADY LATE!
Scope (~fixed): too big!
Team (fixed): 4 (+1) developers
Schedule (fixed): July, 3 months
Iron Triangle
ENTERPRISE EDITION V1.0.0
Extends the Community Edition
Brings workflow, advanced permissions, advanced versioning
Released 1 month late
By reducing scope (simplify and remove features)
By reducing internal quality (technical shortcuts)
NEW ACTIVITY
Support + Maintainance
3 minor versions (1.5 year)
Dedicated person / sprint
Qualify issues
Fix bugs (with new tests)
Release patches
TECHNICAL DEBT
Monetary debt metaphor
Not necessarily a bad thing
Must be managed
Must be paid back
Technical Debt Quadrant, Martin Fowler
TAKE CARE OF THE CODEBASE
Broken windows theory
Criminological theory (1982)
Prevent small crimes to avoid
more serious crimes
Boy scout rule
"Always leave the campground
code cleaner than you found it."
SCALE THE TEAM!
Timeline ... 04/14 ... [11/14] ... today
Akeneo Team 18 (+6)
Product Team 5 (=)
Community Edition v1.2.0 (78k LoC)
Enterprise Edition v1.0.0 (20k LoC)
PRODUCT TEAM SIZE X 3
Akeneo raises $2.4 Million and hiring time!
November + 2, December + 2, January + 2, February +2 ... Stop!
From 5 to 14 people in few months
Impacts on organization and architecture
SCALE THE ORGANIZATION
Squad: pluridisciplinary, autonomous, temporary, has a clear goal
Feature Squad x 3: Delivers finished product increments
Support/Maintainance Squad x 1: Takes care of our ecosystem
Tooling Squad x 1: Takes care of our tools (CI first)
SCALE THE ARCHITECTURE
Quite "monolithic software" is ok for a small team
Team size x 3 ~= features x 3 + side effects x 3 + dependencies x 3
Improve the internal API: querying, data update, validation, etc
Build new features by using this internal API
COUPLING, BUSINESS CODE - ORM
Business code directly uses Doctrine ORM classes
For performance reason, we need to write a direct to DB import
So? Introduce and use new interfaces!
namespace AkeneoComponentStorageUtilsSaver;
interface SaverInterface
{
    public function save($object, array $options = []);
}
// RemoverInterface, ProductRepositoryInterface, AttributeRepositoryInterface, etc
    
COUPLING, BUSINESS CODE - FRAMEWORK
Business code directly uses Symfony Framework classes
In v1.0, product draft edition is coupled to Symfony Form
In v1.4, we need to import product drafts from csv files...
No way to re-use our business code... re-write a decoupled API
BACKWARD COMPATIBILITY
Semantic Versioning (semver.org)
Given a version vMAJOR.MINOR.PATCH
MAJOR+1 when you make incompatible API changes
MINOR+1 when you add functionality in a BC manner
PATCH+1 when you make BC bug fixes
Public API?
Software using Semantic Versioning MUST declare a public API
API could be declared in the code itself or exist strictly in doc
PUBLIC API
Symfony (since v2.3)
Declared in the code (interfaces and @api tag)
Explained in the doc with "Backwards Compatibility Promise"
Akeneo PIM (in v1.4)
Not declared... so, public API = 1500 classes and 6749 methods
We're working on a first declaration: CSV file formats for
imports/exports, connector interfaces and services, internal API,
etc
BC BREAK
Minor version (v1.4.0)
Add new features
Use of @deprecated tag for "API" changes
BC Break on "internal" code only
Upgrade doc and scripts
Patch version (v1.4.1)
Bugs fixes only
No BC Break (at all) on "API" and "internal"
DEPRECATED
Ex: import system has been revamped in v1.4
New system is introduced
Old system is deprecated (code and tests are kept)
Old system is maintained (tests are runned, bugs are fixed)
TODAY
Timeline ... 11/14 ... [today] ...
Akeneo Team 42 (+22)
Product Team 15 (+10)
Community Edition v1.4.0 (134k LoC)
Enterprise Edition v1.4.0 (50k LoC)
WHAT'S NEXT?
Improve User eXperience (productivity, perfs, etc)
Improve Developer eXperience (api, doc, support, etc)
Conquer the (PIM) world!
QUESTIONS?
Nicolas Dupont
@duponico
Join us! We're hiring!
https://joind.in/15714

More Related Content

Viewers also liked (7)

PDF
Inmigración ilegal deja su huella en Europa
Francisco Delgado Morales
 
PPTX
Marquitos
Marco Jose Mejia Tario
 
PDF
Regenerando gerundio
Francisco Delgado Morales
 
PPTX
LIMPIEZA DE MANOS
George Diamandis
 
PPTX
Hot technologies 6
Thomas Canton
 
PDF
Mapa conceptual sobre el alto desempeño
Al Cougar
 
PDF
Team04
Pratik Gulve
 
Inmigración ilegal deja su huella en Europa
Francisco Delgado Morales
 
Regenerando gerundio
Francisco Delgado Morales
 
LIMPIEZA DE MANOS
George Diamandis
 
Hot technologies 6
Thomas Canton
 
Mapa conceptual sobre el alto desempeño
Al Cougar
 
Team04
Pratik Gulve
 

Similar to Edition of an enterprise software in PHP, feedback (20)

PDF
Rewriting a Plugin Architecture 3 Times to Harness the API Economy
Tim Pettersen
 
PPT
Daniel Egan Msdn Tech Days Oc Day2
Daniel Egan
 
PPS
Simplify your professional web development with symfony
Francois Zaninotto
 
PPT
Extending the Enterprise with MEF
Brian Ritchie
 
PPT
Understanding and extending p2 for fun and profit
Pascal Rapicault
 
PDF
Introducing TDD to your project
Bastian Feder
 
PPTX
Going open source with small teams
Jamie Thomas
 
ODP
Simplifying RCP Update and Install
susanfmccourt
 
PDF
Release and-dependency-management memphis python
Joe Ferguson
 
PPTX
Training for New Users
AVEVA
 
PPT
FLossEd-BK Tequila Framework3.2.1
Siwawong Wuttipongprasert
 
PPTX
M365 global developer bootcamp 2019 PA
Thomas Daly
 
PPT
Creating a World-Class RESTful Web Services API
David Keener
 
PPTX
M365 global developer bootcamp 2019 Intro to SPFx Version
Thomas Daly
 
PDF
The "Holy Grail" of Dev/Ops
Erik Osterman
 
PDF
Lublin Startup Festival - Mobile Architecture Design Patterns
Karol Szmaj
 
PDF
Continuous Delivery for Python Developers – PyCon Otto
Peter Bittner
 
PPTX
T4 presentation
Gary Pedretti
 
PDF
Avoiding the domino effect in our [micro]services (SOLID at macro-design level)
CodelyTV
 
DOCX
NIHIT SRIVASTAVA_2.6Years_Resume
Nihit Srivastava
 
Rewriting a Plugin Architecture 3 Times to Harness the API Economy
Tim Pettersen
 
Daniel Egan Msdn Tech Days Oc Day2
Daniel Egan
 
Simplify your professional web development with symfony
Francois Zaninotto
 
Extending the Enterprise with MEF
Brian Ritchie
 
Understanding and extending p2 for fun and profit
Pascal Rapicault
 
Introducing TDD to your project
Bastian Feder
 
Going open source with small teams
Jamie Thomas
 
Simplifying RCP Update and Install
susanfmccourt
 
Release and-dependency-management memphis python
Joe Ferguson
 
Training for New Users
AVEVA
 
FLossEd-BK Tequila Framework3.2.1
Siwawong Wuttipongprasert
 
M365 global developer bootcamp 2019 PA
Thomas Daly
 
Creating a World-Class RESTful Web Services API
David Keener
 
M365 global developer bootcamp 2019 Intro to SPFx Version
Thomas Daly
 
The "Holy Grail" of Dev/Ops
Erik Osterman
 
Lublin Startup Festival - Mobile Architecture Design Patterns
Karol Szmaj
 
Continuous Delivery for Python Developers – PyCon Otto
Peter Bittner
 
T4 presentation
Gary Pedretti
 
Avoiding the domino effect in our [micro]services (SOLID at macro-design level)
CodelyTV
 
NIHIT SRIVASTAVA_2.6Years_Resume
Nihit Srivastava
 
Ad

Recently uploaded (20)

PPTX
Introduction to Neural Networks and Perceptron Learning Algorithm.pptx
Kayalvizhi A
 
PPTX
Evaluation and thermal analysis of shell and tube heat exchanger as per requi...
shahveer210504
 
PPTX
Solar Thermal Energy System Seminar.pptx
Gpc Purapuza
 
PDF
Pressure Measurement training for engineers and Technicians
AIESOLUTIONS
 
DOC
MRRS Strength and Durability of Concrete
CivilMythili
 
PPTX
GitOps_Repo_Structure for begeinner(Scaffolindg)
DanialHabibi2
 
PDF
MAD Unit - 1 Introduction of Android IT Department
JappanMavani
 
PDF
Reasons for the succes of MENARD PRESSUREMETER.pdf
majdiamz
 
PPTX
Introduction to Design of Machine Elements
PradeepKumarS27
 
PPTX
Types of Bearing_Specifications_PPT.pptx
PranjulAgrahariAkash
 
PPTX
Thermal runway and thermal stability.pptx
godow93766
 
PPTX
Hashing Introduction , hash functions and techniques
sailajam21
 
PPTX
GitOps_Without_K8s_Training simple one without k8s
DanialHabibi2
 
PDF
Ethics and Trustworthy AI in Healthcare – Governing Sensitive Data, Profiling...
AlqualsaDIResearchGr
 
PPTX
Mechanical Design of shell and tube heat exchangers as per ASME Sec VIII Divi...
shahveer210504
 
PPTX
Worm gear strength and wear calculation as per standard VB Bhandari Databook.
shahveer210504
 
DOCX
CS-802 (A) BDH Lab manual IPS Academy Indore
thegodhimself05
 
PDF
International Journal of Information Technology Convergence and services (IJI...
ijitcsjournal4
 
DOCX
8th International Conference on Electrical Engineering (ELEN 2025)
elelijjournal653
 
PDF
Unified_Cloud_Comm_Presentation anil singh ppt
anilsingh298751
 
Introduction to Neural Networks and Perceptron Learning Algorithm.pptx
Kayalvizhi A
 
Evaluation and thermal analysis of shell and tube heat exchanger as per requi...
shahveer210504
 
Solar Thermal Energy System Seminar.pptx
Gpc Purapuza
 
Pressure Measurement training for engineers and Technicians
AIESOLUTIONS
 
MRRS Strength and Durability of Concrete
CivilMythili
 
GitOps_Repo_Structure for begeinner(Scaffolindg)
DanialHabibi2
 
MAD Unit - 1 Introduction of Android IT Department
JappanMavani
 
Reasons for the succes of MENARD PRESSUREMETER.pdf
majdiamz
 
Introduction to Design of Machine Elements
PradeepKumarS27
 
Types of Bearing_Specifications_PPT.pptx
PranjulAgrahariAkash
 
Thermal runway and thermal stability.pptx
godow93766
 
Hashing Introduction , hash functions and techniques
sailajam21
 
GitOps_Without_K8s_Training simple one without k8s
DanialHabibi2
 
Ethics and Trustworthy AI in Healthcare – Governing Sensitive Data, Profiling...
AlqualsaDIResearchGr
 
Mechanical Design of shell and tube heat exchangers as per ASME Sec VIII Divi...
shahveer210504
 
Worm gear strength and wear calculation as per standard VB Bhandari Databook.
shahveer210504
 
CS-802 (A) BDH Lab manual IPS Academy Indore
thegodhimself05
 
International Journal of Information Technology Convergence and services (IJI...
ijitcsjournal4
 
8th International Conference on Electrical Engineering (ELEN 2025)
elelijjournal653
 
Unified_Cloud_Comm_Presentation anil singh ppt
anilsingh298751
 
Ad

Edition of an enterprise software in PHP, feedback

  • 1. Edition of an Enterprise Software in PHP NICOLAS DUPONT @duponico #forumphp joind.in/15714
  • 2. NICOLAS DUPONT Co-founder & Lead Developer @duponico nidup agile software dev, continuous improvement, open source, beers.
  • 3. ENTERPRISE SOFTWARE Solves an enterprise-wide problem Improves the productivity Is robust and reliable For instance, Enterprise Resource Planning (ERP), Business Intelligence (BI), Customer Relationship Management (CRM), Business Process Management (BPM), Master Data Management (MDM), etc
  • 5. COMMUNITY & ENTERPRISE EDITIONS Symfony 2.7 Full Stack + Community Bundles Open Source license, free of charge Symfony 2.7 Full Stack + Community Bundles + Enterprise Bundles + SLA-backed support Commercial license, annual subscription fee 25k+ installations 134k LoC (PHP) 60+ customers 134k LoC + 49k LoC (PHP)
  • 6. FEW ENTERPRISE CUSTOMERS Clothing & Accessories Retailers Service Specialist Retailers Others ... ... ... ... ...
  • 8. KICK OFF Timeline [01/13] ... 06/13 ... Akeneo Team 4 Product Team 2 Community Edition starting (0 LoC) Enterprise Edition not started
  • 9. WHY PHP? Strong community Open source friendly Good libraries (ex: thephpleague) More and more mature (ex: composer) Easy to hire for our partners
  • 10. WHY SYMFONY (FULL STACK)? Proven Framework Strong community Good documentation Guidelines/practises Speed up the development
  • 11. BUSINESS APPLICATION NEEDS UI (navigation, grid, etc) User Security Workflow Reporting ... Common requirements Same needs than OroCRM Let's contribute to
  • 12. FIRST DIFFICULTIES Few months later... Lot of technical pieces started... Nothing 100% finished, Nothing 100% useable
  • 13. NEW ORGANIZATION! Product owner joins the team Scrum team (2 weeks / sprint) Focus on business value Focus on finished increments Focus on technical practises
  • 14. RESPONSIBILITIES Product Owner Build the right thing Developer Build the thing right Agile coach Build the thing fast
  • 15. ALPHA RELEASE! Timeline 01/13 ... [06/13] ... 01/14 ... Akeneo Team 7 (+3) Product Team 5 (+3) Community Edition v1.0.0-alpha (39k LoC) Enterprise Edition not started
  • 16. FIRST PROJECTS We integrate a first project on v1.0.0-alpha Solution partners integrate few others Integration? standard distrib, write custom import and export, add extra models, write specific business rules, create new screens, etc Problems! extensibility, unclear naming, lake of interfaces, too much responsibilities per class, etc
  • 17. CUSTOMIZABLE+MAINTAINABLE SOLID OOP principles + Dependency Injection Container + Unit Tests + Functional Tests = Easy to change any small part of the app PhpMetric, size = Complexity, color = Maintainability pim_catalog.updater.product_property_setter:     class: %pim_catalog.updater.product_property_setter.class%     arguments:         ­ '@pim_catalog.repository.cached_attribute'         ­ '@pim_catalog.updater.setter.registry'     
  • 18. UNIT TESTS 1) Describe a class behavior 2) Implement the behavior 3) Refactor the code >> Helps to specify and design classes Today, ~1000 specs         class ProductBuilderSpec extends ObjectBehavior         {//[...]         function it_creates_product_without_family($repository, AttributeInterface $sku)         {         $repository­>getIdentifier()­>willReturn($sku);         $this­>createProduct()­>shouldReturnAnInstanceOf(self::PRODUCT_CLASS);         }//[...]     
  • 19. FUNCTIONAL TESTS 1) Describe a feature 2) Implement it >> Helps to specify features today, ~1400 scenarios Feature: Edit a product     [...]     Scenario: Successfully edit and save a product         Given I am logged in as "Mary"         And I am on the "sandal" product page         And I fill in the following information:             | Name | My Sandal |         When I press the "Save" button         Then I should be on the product "sandal" page         And the product Name should be "My Sandal"     
  • 20. CONTINUOUS INTEGRATION Jenkins CI Static analysis (phpmd, phpcs, phpcpd, jshint, etc) Unit Tests (phpspec, jasmine) Functional + API Tests (behat) Jenkins CI Travis CI Static analysis + Unit Tests Github Integration Travis CI
  • 21. CODE WORKFLOW (GIT) For each story / bug, Create a new branch Write code + tests Do a pull request Check the Definition Of Done (DOD) Merge Definition Of Done (Story) | Q                     | A | ­­­­­­­­­­­­­­­­­­­­­ | ­­­ | Specs                 | | Behats                | | Blue CI               | | Changelog updated     | | Code review and 2 GTM | | Micro Demo (PO)       | | Migration script      | | Tech Doc              |     
  • 22. STABLE RELEASE! Timeline ... 06/13 ... [01/14] ... 04/14 ... Akeneo Team 9 (+2) Product Team 5 (=) Community Edition v1.0.0 (62k LoC) Enterprise Edition not started
  • 23. COMMUNITY EDITION V1.0.0 Hard to release the first stable version Why? very last change, postpone, another one, etc So? ~2 months to "finish" Lot of new projects (and problems)! "If you are not embarrassed by the first version of your product, you’ve launched too late." Reid Hoffman
  • 24. PERFORMANCE PROBLEM Customer with 100k products, 100 attributes Application is slow (grids, forms)... Why? Doctrine ORM hydration + greedy algo So? ~1 month to optimize the code
  • 25. SCALABILITY PROBLEM Customer with 1M+ products Application will not work... Why? RDBMS + Entity Attribute Value (EAV) So? ~1 month to add a MongoDB storage + minor release
  • 26. LET'S START THE ENTERPRISE EDITION! Timeline ... 01/14 ... [04/14] ... 11/14 ... Akeneo Team 12 (+3) Product Team 5 (=) Community Edition v1.1.0 (67k LoC) Enterprise Edition starting
  • 27. NOT STARTED, ALREADY LATE! Scope (~fixed): too big! Team (fixed): 4 (+1) developers Schedule (fixed): July, 3 months Iron Triangle
  • 28. ENTERPRISE EDITION V1.0.0 Extends the Community Edition Brings workflow, advanced permissions, advanced versioning Released 1 month late By reducing scope (simplify and remove features) By reducing internal quality (technical shortcuts)
  • 29. NEW ACTIVITY Support + Maintainance 3 minor versions (1.5 year) Dedicated person / sprint Qualify issues Fix bugs (with new tests) Release patches
  • 30. TECHNICAL DEBT Monetary debt metaphor Not necessarily a bad thing Must be managed Must be paid back Technical Debt Quadrant, Martin Fowler
  • 31. TAKE CARE OF THE CODEBASE Broken windows theory Criminological theory (1982) Prevent small crimes to avoid more serious crimes Boy scout rule "Always leave the campground code cleaner than you found it."
  • 32. SCALE THE TEAM! Timeline ... 04/14 ... [11/14] ... today Akeneo Team 18 (+6) Product Team 5 (=) Community Edition v1.2.0 (78k LoC) Enterprise Edition v1.0.0 (20k LoC)
  • 33. PRODUCT TEAM SIZE X 3 Akeneo raises $2.4 Million and hiring time! November + 2, December + 2, January + 2, February +2 ... Stop! From 5 to 14 people in few months Impacts on organization and architecture
  • 34. SCALE THE ORGANIZATION Squad: pluridisciplinary, autonomous, temporary, has a clear goal Feature Squad x 3: Delivers finished product increments Support/Maintainance Squad x 1: Takes care of our ecosystem Tooling Squad x 1: Takes care of our tools (CI first)
  • 35. SCALE THE ARCHITECTURE Quite "monolithic software" is ok for a small team Team size x 3 ~= features x 3 + side effects x 3 + dependencies x 3 Improve the internal API: querying, data update, validation, etc Build new features by using this internal API
  • 36. COUPLING, BUSINESS CODE - ORM Business code directly uses Doctrine ORM classes For performance reason, we need to write a direct to DB import So? Introduce and use new interfaces! namespace AkeneoComponentStorageUtilsSaver; interface SaverInterface {     public function save($object, array $options = []); } // RemoverInterface, ProductRepositoryInterface, AttributeRepositoryInterface, etc     
  • 37. COUPLING, BUSINESS CODE - FRAMEWORK Business code directly uses Symfony Framework classes In v1.0, product draft edition is coupled to Symfony Form In v1.4, we need to import product drafts from csv files... No way to re-use our business code... re-write a decoupled API
  • 38. BACKWARD COMPATIBILITY Semantic Versioning (semver.org) Given a version vMAJOR.MINOR.PATCH MAJOR+1 when you make incompatible API changes MINOR+1 when you add functionality in a BC manner PATCH+1 when you make BC bug fixes Public API? Software using Semantic Versioning MUST declare a public API API could be declared in the code itself or exist strictly in doc
  • 39. PUBLIC API Symfony (since v2.3) Declared in the code (interfaces and @api tag) Explained in the doc with "Backwards Compatibility Promise" Akeneo PIM (in v1.4) Not declared... so, public API = 1500 classes and 6749 methods We're working on a first declaration: CSV file formats for imports/exports, connector interfaces and services, internal API, etc
  • 40. BC BREAK Minor version (v1.4.0) Add new features Use of @deprecated tag for "API" changes BC Break on "internal" code only Upgrade doc and scripts Patch version (v1.4.1) Bugs fixes only No BC Break (at all) on "API" and "internal"
  • 41. DEPRECATED Ex: import system has been revamped in v1.4 New system is introduced Old system is deprecated (code and tests are kept) Old system is maintained (tests are runned, bugs are fixed)
  • 42. TODAY Timeline ... 11/14 ... [today] ... Akeneo Team 42 (+22) Product Team 15 (+10) Community Edition v1.4.0 (134k LoC) Enterprise Edition v1.4.0 (50k LoC)
  • 43. WHAT'S NEXT? Improve User eXperience (productivity, perfs, etc) Improve Developer eXperience (api, doc, support, etc) Conquer the (PIM) world!
  • 44. QUESTIONS? Nicolas Dupont @duponico Join us! We're hiring! https://joind.in/15714