Frameworks are very helpful to solve common problems when developing an application. But what happens when we have to move to another framework? In this talk I will show how my company tries to keep independent of any framework, decoupling our business logic from symfony.
Back to Basics 2017: Mí primera aplicación MongoDBMongoDB
Descubra:
Cómo instalar MongoDB y usar el shell de MongoDB
Las operaciones básicas de CRUD
Cómo analizar el rendimiento de las consultas y añadir un índice
Back to Basics Spanish 4 Introduction to shardingMongoDB
Cómo MongoDB amplía el rendimiento de las operaciones de escritura y maneja grandes tamaño de datos
Cómo crear un sharded cluster básico
Cómo elegir una clave de sharding
Conceptos básicos. Seminario web 2: Su primera aplicación MongoDBMongoDB
Este es el segundo seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. En este seminario web mostraremos cómo construir una aplicación de creación de blogs en MongoDB.
This presentation was given at the LDS Tech SORT Conference 2011 in Salt Lake City. The slides are quite comprehensive covering many topics on MongoDB. Rather than a traditional presentation, this was presented as more of a Q & A session. Topics covered include. Introduction to MongoDB, Use Cases, Schema design, High availability (replication) and Horizontal Scaling (sharding).
Conceptos básicos. seminario web 3 : Diseño de esquema pensado para documentosMongoDB
Este es el tercer seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. En este seminario web se explica la arquitectura de las bases de datos de documentos.
MongoDB Days Silicon Valley: Jumpstart: Ops/Admin 101MongoDB
Presented by Achille Brighton, Principal Consulting Engineer, MongoDB
Experience level: Introductory
New to MongoDB? We'll provide an overview of installation, high availability through replication, scale out through sharding, and options for monitoring and backup. No prior knowledge of MongoDB is assumed. This session will jumpstart your knowledge of MongoDB operations, providing you with context for the rest of the day's content.
Back to Basics 2017: Mí primera aplicación MongoDBMongoDB
Descubra:
Cómo instalar MongoDB y usar el shell de MongoDB
Las operaciones básicas de CRUD
Cómo analizar el rendimiento de las consultas y añadir un índice
Back to Basics Spanish 4 Introduction to shardingMongoDB
Cómo MongoDB amplía el rendimiento de las operaciones de escritura y maneja grandes tamaño de datos
Cómo crear un sharded cluster básico
Cómo elegir una clave de sharding
Conceptos básicos. Seminario web 2: Su primera aplicación MongoDBMongoDB
Este es el segundo seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. En este seminario web mostraremos cómo construir una aplicación de creación de blogs en MongoDB.
This presentation was given at the LDS Tech SORT Conference 2011 in Salt Lake City. The slides are quite comprehensive covering many topics on MongoDB. Rather than a traditional presentation, this was presented as more of a Q & A session. Topics covered include. Introduction to MongoDB, Use Cases, Schema design, High availability (replication) and Horizontal Scaling (sharding).
Conceptos básicos. seminario web 3 : Diseño de esquema pensado para documentosMongoDB
Este es el tercer seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. En este seminario web se explica la arquitectura de las bases de datos de documentos.
MongoDB Days Silicon Valley: Jumpstart: Ops/Admin 101MongoDB
Presented by Achille Brighton, Principal Consulting Engineer, MongoDB
Experience level: Introductory
New to MongoDB? We'll provide an overview of installation, high availability through replication, scale out through sharding, and options for monitoring and backup. No prior knowledge of MongoDB is assumed. This session will jumpstart your knowledge of MongoDB operations, providing you with context for the rest of the day's content.
Back to Basics, webinar 2: La tua prima applicazione MongoDBMongoDB
Questo è il secondo webinar della serie Back to Basics che ti offrirà un'introduzione al database MongoDB. In questo webinar ti dimostreremo come creare un'applicazione base per il blogging in MongoDB.
Back to Basics Spanish Webinar 3 - Introducción a los replica setsMongoDB
Cómo crear un clúster de producción
Cómo crear un replica set
Cómo MongoDB gestiona la persistencia de los datos y cómo un conjunto de réplicas se recupera automáticamente de todo tipo de fallos
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...MongoDB
Este es el cuarto seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. Este seminario se ve en la compatibilidad con índices de texto libre y geoespaciales.
Использование Elasticsearch для организации поиска по сайтуOlga Lavrentieva
Дмитрий Жлобо, Ruby and Rails Developer в Twinslash
«Использование Elasticsearch для организации поиска по сайту»
Организация качественного поиска на сайте – сложная и нетривиальная задача. В своем докладе Дмитрий расскажет о том, как ее решить с помощью Elasticsearch.
Будет рассмотрено, как Elasticsearch работает с текстом или другими данными: от анализа и индексации документов до поиска и агрегации. По шагам и на примерах будет показано, как настроить поиск, учитывающий, например, морфологию и фонетику русского языка. Также Дмитрий расскажет, как все это использовать в приложениях на Ruby, как организовать добавление документов в индекс и др.
Back to Basics Webinar 3: Schema Design Thinking in DocumentsMongoDB
This is the third webinar of a Back to Basics series that will introduce you to the MongoDB database. This webinar will explain the architecture of document databases.
Conceptos básicos. Seminario web 5: Introducción a Aggregation FrameworkMongoDB
Este es el quinto seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. En este seminario web, se analizan los aspectos básicos de Aggregation Framework.
Back to Basics Webinar 1: Introduction to NoSQLMongoDB
This is the first webinar of a Back to Basics series that will introduce you to the MongoDB database, what it is, why you would use it, and what you would use it for.
Webinar: Getting Started with MongoDB - Back to BasicsMongoDB
Part one an Introduction to MongoDB. Learn how easy it is to start building applications with MongoDB. This session covers key features and functionality of MongoDB and sets out the course of building an application.
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...MongoDB
Il s'agit du deuxième webinaire de la série « Retour aux fondamentaux » qui a pour but de vous présenter la base de données MongoDB. Dans ce webinaire, nous vous expliquerons comment créer une application de création de blogs dans MongoDB.
Quando uma aplicação começa a ficar grande e complexa, fazer buscas nos seus models torna-se uma tarefa complicada. Efetuar as buscas diretamente no banco de dados é um processo lento, ineficiente e que permite pouca ou nenhuma maleabilidade sobre a forma com que a busca é feita. Surge então o ElasticSearch, uma engine de busca utilizada por empresas como Github, Twitter e 4square para indexar e buscar literalmente milhões de documentos em tempo real. Nessa palestra, explicarei quando, como e porque utilizar o ElasticSearch para facilmente indexar e efetuar buscas complexas nos seus models.
Presented to the LA JUG. Covers the CRUD operations, indexes, relationships, and transactions with the datastore, memcache, deployment, testing, and more. Content is likely very outdated. 2 hours with Q&A.
(Note that contents may be highly outdated by now.)
Back to Basics, webinar 2: La tua prima applicazione MongoDBMongoDB
Questo è il secondo webinar della serie Back to Basics che ti offrirà un'introduzione al database MongoDB. In questo webinar ti dimostreremo come creare un'applicazione base per il blogging in MongoDB.
Back to Basics Spanish Webinar 3 - Introducción a los replica setsMongoDB
Cómo crear un clúster de producción
Cómo crear un replica set
Cómo MongoDB gestiona la persistencia de los datos y cómo un conjunto de réplicas se recupera automáticamente de todo tipo de fallos
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...MongoDB
Este es el cuarto seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. Este seminario se ve en la compatibilidad con índices de texto libre y geoespaciales.
Использование Elasticsearch для организации поиска по сайтуOlga Lavrentieva
Дмитрий Жлобо, Ruby and Rails Developer в Twinslash
«Использование Elasticsearch для организации поиска по сайту»
Организация качественного поиска на сайте – сложная и нетривиальная задача. В своем докладе Дмитрий расскажет о том, как ее решить с помощью Elasticsearch.
Будет рассмотрено, как Elasticsearch работает с текстом или другими данными: от анализа и индексации документов до поиска и агрегации. По шагам и на примерах будет показано, как настроить поиск, учитывающий, например, морфологию и фонетику русского языка. Также Дмитрий расскажет, как все это использовать в приложениях на Ruby, как организовать добавление документов в индекс и др.
Back to Basics Webinar 3: Schema Design Thinking in DocumentsMongoDB
This is the third webinar of a Back to Basics series that will introduce you to the MongoDB database. This webinar will explain the architecture of document databases.
Conceptos básicos. Seminario web 5: Introducción a Aggregation FrameworkMongoDB
Este es el quinto seminario web de la serie Conceptos básicos, en la que se realiza una introducción a la base de datos MongoDB. En este seminario web, se analizan los aspectos básicos de Aggregation Framework.
Back to Basics Webinar 1: Introduction to NoSQLMongoDB
This is the first webinar of a Back to Basics series that will introduce you to the MongoDB database, what it is, why you would use it, and what you would use it for.
Webinar: Getting Started with MongoDB - Back to BasicsMongoDB
Part one an Introduction to MongoDB. Learn how easy it is to start building applications with MongoDB. This session covers key features and functionality of MongoDB and sets out the course of building an application.
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...MongoDB
Il s'agit du deuxième webinaire de la série « Retour aux fondamentaux » qui a pour but de vous présenter la base de données MongoDB. Dans ce webinaire, nous vous expliquerons comment créer une application de création de blogs dans MongoDB.
Quando uma aplicação começa a ficar grande e complexa, fazer buscas nos seus models torna-se uma tarefa complicada. Efetuar as buscas diretamente no banco de dados é um processo lento, ineficiente e que permite pouca ou nenhuma maleabilidade sobre a forma com que a busca é feita. Surge então o ElasticSearch, uma engine de busca utilizada por empresas como Github, Twitter e 4square para indexar e buscar literalmente milhões de documentos em tempo real. Nessa palestra, explicarei quando, como e porque utilizar o ElasticSearch para facilmente indexar e efetuar buscas complexas nos seus models.
Presented to the LA JUG. Covers the CRUD operations, indexes, relationships, and transactions with the datastore, memcache, deployment, testing, and more. Content is likely very outdated. 2 hours with Q&A.
(Note that contents may be highly outdated by now.)
Learning To Run - XPages for Lotus Notes Client DevelopersKathy Brown
You’re an experienced Lotus Notes developer. You’ve been doing “classic” development for years. You know LotusScript better than your native language. You know @Formula like the back of your hand. But when it comes to Xpages and Javascript, you feel like you’re learning to walk all over again. This session will cover some tips and tricks to get you up and running in Xpages. Learn how to translate what you already know, into what you need to know for Xpages. Find out where to get the information to be just as skillful at Xpages as you are with Notes client development.
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rulesSrijan Technologies
Speaker: Josef Dabernig a.k.a Dasjo
This webinar takes a look at how to automate some powerful backend capabilities for your Drupal site, using the Drupal 8 Rules. Take a look at how D8 Rules can change the way we build sites. Also, learn how you can contribute to getting Rules closer to a stable release.
Building Large Scale PHP Web Applications with Laravel 4Darwin Biler
Learn how Laravel 4 can be leveraged to its fullest by making use of its powerful design patterns, specifically IoC Container and Dependency Injection.
Get things done with Yii - quickly build webapplicationsGiuliano Iacobelli
Lesson teached at Università di Roma Tre - Software Engineering course.
Web is plenty of amazing tools used daily by millions of people. A good idea can turn to be a highly profitable business if well executed. Yii framework is an ideal tool to build in short time an MVP of your product to start as soon as possible to find your market fit. Here follows some infos about the framework and steps on how to build a simple blog over Yii.
Lecture on CodeIgniter, # OSS Essential Training Program at Chittagong University of Engineering Technology, February 2008, http://bdosdn.org/wsatcuet.php
Practical tips for dealing with projects involving legacy code. Covers investigating past projects, static analysis of existing code, and methods for changing legacy code.
Presented at PHP Benelux '10
Custom, in depth 5 day PHP course I put together in 2014. I'm available to deliver this training in person at your offices - contact me at rich@quicloud.com for rate quotes.
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Tobias Schneck
As AI technology is pushing into IT I was wondering myself, as an “infrastructure container kubernetes guy”, how get this fancy AI technology get managed from an infrastructure operational view? Is it possible to apply our lovely cloud native principals as well? What benefit’s both technologies could bring to each other?
Let me take this questions and provide you a short journey through existing deployment models and use cases for AI software. On practical examples, we discuss what cloud/on-premise strategy we may need for applying it to our own infrastructure to get it to work from an enterprise perspective. I want to give an overview about infrastructure requirements and technologies, what could be beneficial or limiting your AI use cases in an enterprise environment. An interactive Demo will give you some insides, what approaches I got already working for real.
Neuro-symbolic is not enough, we need neuro-*semantic*Frank van Harmelen
Neuro-symbolic (NeSy) AI is on the rise. However, simply machine learning on just any symbolic structure is not sufficient to really harvest the gains of NeSy. These will only be gained when the symbolic structures have an actual semantics. I give an operational definition of semantics as “predictable inference”.
All of this illustrated with link prediction over knowledge graphs, but the argument is general.
Elevating Tactical DDD Patterns Through Object CalisthenicsDorra BARTAGUIZ
After immersing yourself in the blue book and its red counterpart, attending DDD-focused conferences, and applying tactical patterns, you're left with a crucial question: How do I ensure my design is effective? Tactical patterns within Domain-Driven Design (DDD) serve as guiding principles for creating clear and manageable domain models. However, achieving success with these patterns requires additional guidance. Interestingly, we've observed that a set of constraints initially designed for training purposes remarkably aligns with effective pattern implementation, offering a more ‘mechanical’ approach. Let's explore together how Object Calisthenics can elevate the design of your tactical DDD patterns, offering concrete help for those venturing into DDD for the first time!
UiPath Test Automation using UiPath Test Suite series, part 4DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 4. In this session, we will cover Test Manager overview along with SAP heatmap.
The UiPath Test Manager overview with SAP heatmap webinar offers a concise yet comprehensive exploration of the role of a Test Manager within SAP environments, coupled with the utilization of heatmaps for effective testing strategies.
Participants will gain insights into the responsibilities, challenges, and best practices associated with test management in SAP projects. Additionally, the webinar delves into the significance of heatmaps as a visual aid for identifying testing priorities, areas of risk, and resource allocation within SAP landscapes. Through this session, attendees can expect to enhance their understanding of test management principles while learning practical approaches to optimize testing processes in SAP environments using heatmap visualization techniques
What will you get from this session?
1. Insights into SAP testing best practices
2. Heatmap utilization for testing
3. Optimization of testing processes
4. Demo
Topics covered:
Execution from the test manager
Orchestrator execution result
Defect reporting
SAP heatmap example with demo
Speaker:
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
Connector Corner: Automate dynamic content and events by pushing a buttonDianaGray10
Here is something new! In our next Connector Corner webinar, we will demonstrate how you can use a single workflow to:
Create a campaign using Mailchimp with merge tags/fields
Send an interactive Slack channel message (using buttons)
Have the message received by managers and peers along with a test email for review
But there’s more:
In a second workflow supporting the same use case, you’ll see:
Your campaign sent to target colleagues for approval
If the “Approve” button is clicked, a Jira/Zendesk ticket is created for the marketing design team
But—if the “Reject” button is pushed, colleagues will be alerted via Slack message
Join us to learn more about this new, human-in-the-loop capability, brought to you by Integration Service connectors.
And...
Speakers:
Akshay Agnihotri, Product Manager
Charlie Greenberg, Host
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...UiPathCommunity
💥 Speed, accuracy, and scaling – discover the superpowers of GenAI in action with UiPath Document Understanding and Communications Mining™:
See how to accelerate model training and optimize model performance with active learning
Learn about the latest enhancements to out-of-the-box document processing – with little to no training required
Get an exclusive demo of the new family of UiPath LLMs – GenAI models specialized for processing different types of documents and messages
This is a hands-on session specifically designed for automation developers and AI enthusiasts seeking to enhance their knowledge in leveraging the latest intelligent document processing capabilities offered by UiPath.
Speakers:
👨🏫 Andras Palfi, Senior Product Manager, UiPath
👩🏫 Lenka Dulovicova, Product Program Manager, UiPath
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Jeffrey Haguewood
Sidekick Solutions uses Bonterra Impact Management (fka Social Solutions Apricot) and automation solutions to integrate data for business workflows.
We believe integration and automation are essential to user experience and the promise of efficient work through technology. Automation is the critical ingredient to realizing that full vision. We develop integration products and services for Bonterra Case Management software to support the deployment of automations for a variety of use cases.
This video focuses on the notifications, alerts, and approval requests using Slack for Bonterra Impact Management. The solutions covered in this webinar can also be deployed for Microsoft Teams.
Interested in deploying notification automations for Bonterra Impact Management? Contact us at sales@sidekicksolutionsllc.com to discuss next steps.
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
2. Who I am?
• Miguel Gallardo
• Cordoba, Argentina
• Spent more than 15 years writing software
• Software Engineer @ ProPoint Solutions, LLC
(http://propointglobal.com/)
• @mg3dem (twitter, linkedin, facebook, instagram)
• mgallardo@propointglobal.com
3. • Wrote a lot of Hello world scripts
• make it show dynamic content!
• Guestbook or todo list using a DB
• Inline HTML in php sucks, it becomes tedious to change logic. You
can separate both! presentation logic and the business logic.
• Discover Libraries, there is a library for everything!
• what happens if we get together a lot of libraries? A framework!
• Everyone tries to make a framework!
• Frameworks becomes a must in php development
6. –Wikipedia
“coupling is the degree of interdependence
between software modules; a measure of how
closely connected two routines or modules are; the
strength of the relationships between modules.”
8. Benefits of decoupling
• Minimize dependency of external frameworks, libraries
• Minimize backward compatibility breaks
• More portable
• More reusable
• Easier to change implementations
• Easier to maintain
• Easier to test
• More clean code and architecture
11. • Frameworks come and go, especially in the PHP world
• There are dozens if not hundreds of PHP frameworks,
most of which no one has heard of
• The popular frameworks, well they have gone through
major revamps at least once in their lifetime
• people do is keep their code with the old framework,
sacrificing years of potential bug and security fixes for not
updating
12. – Christopher Stea
“The whole point of framework independence is to
protect our business logic from these scenarios and
one can even update to the latest framework with
ease without major rewrites”
13.
14. Some rules
• All code MUST obey the Law of Demeter
• a given object should assume as little as possible about the structure or
properties of anything else.
• All code MUST follow the Single Responsibility Principal
• a given object should assume as little as possible about the structure or
properties of anything else.
• Software entities (classes, modules, functions, etc.)
should be open for extension, but closed for modification
• Can allow to be extended without modifying its source code
16. • Represents a single record of data
• Getters and Setters
• Can link to other entities that represent the relations
between them
• Must be independent of the hosting framework
• Must be kept lean with no business logic and no logic for
data persistence != ActiveRecord
17. <?php
class Customer
{
/**
* @var int
*/
private $id;
private $phoneNumber;
private $user;
/**
* @var CustomerStatus
*/
private $status;
public function __construct(User $user, int $phoneNumber) {}
public function getId(): ?int {}
public function getPhoneNumber(): int {}
/**
* Set status
*
* @param CustomerStatus $customerStatus CustomerStatus Entity.
*
* @return Customer
*/
public function setStatus(CustomerStatus $customerStatus): Customer
{
$this->status = $customerStatus;
return $this;
}
}
19. • Represents the data persistence layer
• Code pertaining to fetching and saving entities should be specified in the
repository
• Should be lean and free from business logic.
• It’s an Interface
• Implemented by data repository (DB abstraction layer, API
layer, etc)
20. <?php
namespace PropointSmsCustomerRepository;
use PropointSmsAccountEntityUser;
use PropointSmsCustomerEntityCustomer;
interface CustomerRepositoryInterface
{
/**
* Save customer entity.
*
* @param Customer $customer Customer entity.
*/
public function save(Customer $customer): void;
/**
* Get Customer record for a customer of a specific store.
*
* @param User $user User entity.
* @param int $phoneNumber Customer phone number.
*
* @return null|Customer
*/
public function getByPhoneNumber(User $user, int $phoneNumber): ?Customer;
/**
* Get all customer entries for a specified phone number
*
* @param int $phoneNumber Phone number.
*
* @return Customer[]
*/
public function getAllByPhoneNumber(int $phoneNumber): array;
}
22. • Contains all of the business logic of an application
• Should be completely agnostic to data persistence
• Act as a abstraction layer for repositories
• May use other services for data retrieval
• But NOT to persist data
• Use event subscribers instead!
• Must be independent of the framework
23. <?php
class CustomerService implements PropointSmsCustomerCustomerServiceInterface
{
private $eventDispatcher;
private $customerRepository;
private $customerStatusRepository;
public function getStatus(string $statusName): CustomerStatus
{
return $this->customerStatusRepository->getByName($statusName);
}
public function create(User $user, int $phoneNumber): Customer
{
$customer = new Customer($user, $phoneNumber);
$customer->setStatus($this->getStatus('ACTIVE'));
return $customer;
}
public function getByPhoneNumber(User $user, int $phoneNumber): Customer
{
return $this->customerRepository->getByPhoneNumber($user, $phoneNumber);
}
public function save(Customer $customer): void
{
$this->customerRepository->save($customer);
if (empty($customer->getId())) { //New customer
$this->eventDispatcher->dispatch(CustomerCreated::NAME, new CustomerCreated($customer));
}
$this->eventDispatcher->dispatch(CustomerUpdated::NAME, new CustomerUpdated($customer));
}
}
25. • Focus on receiving an incoming HTTP request, fetching
incoming parameters and returning an HTTP response.
• Must be kept lean and free from business logic.
• Pass parameter to services for processing
• And use the results to generate a response.
26. <?php
class MessageController extends FOSRestBundleControllerFOSRestController
{
public function postIndexAction(
Request $request,
MessageServiceInterface $messageService,
CustomerServiceInterface $customerService,
UserServiceInterface $userService
): Response {
$payload = json_decode($request->getContent(), true);
try {
if (empty($payload)) {
throw new SymfonyComponentHttpKernelExceptionBadRequestHttpException(
'Invalid JSON in request body.'
);
}
try {
$user = $userService->getByUsername($this->getUser()->getUserName());
$message = $messageService->loadFromArray($user, $payload);
$customer = $customerService->getOrCreateCustomer($user, $message->getPhoneNumber());
$canSend = $customer->getStatus()->canSendSms();
if (!$canSend) {
$message->setStatus($messageService->getStatus('FORBIDDEN'));
}
$message->setCustomer($customer);
$messageService->save($message);
if (!$canSend) {
throw new SymfonyComponentHttpKernelExceptionAccessDeniedHttpException(
'Cannot send SMS to opt-out customer'
);
}
} catch (InvalidArgumentException $exception) {
throw new SymfonyComponentHttpKernelExceptionUnprocessableEntityHttpException(
$exception->getMessage(),
$exception
);….
30. • Good protection against external changes, but doesn’t
mean that it should always be applied everywhere!
• We can’t always decouple from everything
• The decision of when to use it depends on the context
(project, team, industry, etc)
• Be pragmatic:
• use the right tool for the right job
• Doesn’t apply patterns without a problem solved by a design pattern
31. • Think of your modules as independent, as if the rest of
the program didn't exist
• Prefer abstractions - they tend to help you think of your
modules as independent
• Design patterns of course
• Cohesive code is often decoupled
• Prefer composition, over inheritance.
• Use layers of architecture