Stay Ahead, Stay ONMINE

Data Science: From School to Work, Part II

In my previous article, I highlighted the importance of effective project management in Python development. Now, let’s shift our focus to the code itself and explore how to write clean, maintainable code — an essential practice in professional and collaborative environments.  Readability & Maintainability: Well-structured code is easier to read, understand, and modify. Other developers — or even your future self — can quickly grasp the logic without struggling to decipher messy code. Debugging & Troubleshooting: Organized code with clear variable names and structured functions makes it easier to identify and fix bugs efficiently. Scalability & Reusability: Modular, well-organized code can be reused across different projects, allowing for seamless scaling without disrupting existing functionality. So, as you work on your next Python project, remember:  Half of good code is Clean Code. Introduction Python is one of the most popular and versatile Programming languages, appreciated for its simplicity, comprehensibility and large community. Whether web development, data analysis, artificial intelligence or automation of tasks — Python offers powerful and flexible tools that are suitable for a wide range of areas. However, the efficiency and maintainability of a Python project depends heavily on the practices used by the developers. Poor structuring of the code, a lack of conventions or even a lack of documentation can quickly turn a promising project into a maintenance and development-intensive puzzle. It is precisely this point that makes the difference between student code and professional code. This article is intended to present the most important best practices for writing high-quality Python code. By following these recommendations, developers can create scripts and applications that are not only functional, but also readable, performant and easily maintainable by third parties. Adopting these best practices right from the start of a project not only ensures better collaboration within teams, but also prepares your code to evolve with future needs. Whether you’re a beginner or an experienced developer, this guide is designed to support you in all your Python developments. The code structuration Good code structuring in Python is essential. There are two main project layouts: flat layout and src layout. The flat layout places the source code directly in the project root without an additional folder. This approach simplifies the structure and is well-suited for small scripts, quick prototypes, and projects that do not require complex packaging. However, it may lead to unintended import issues when running tests or scripts. 📂 my_project/ ├── 📂 my_project/ # Directly in the root │ ├── 🐍 __init__.py │ ├── 🐍 main.py # Main entry point (if needed) │ ├── 🐍 module1.py # Example module │ └── 🐍 utils.py ├── 📂 tests/ # Unit tests │ ├── 🐍 test_module1.py │ ├── 🐍 test_utils.py │ └── … ├── 📄 .gitignore # Git ignored files ├── 📄 pyproject.toml # Project configuration (Poetry, setuptools) ├── 📄 uv.lock # UV file ├── 📄 README.md # Main project documentation ├── 📄 LICENSE # Project license ├── 📄 Makefile # Automates common tasks ├── 📄 DockerFile # Automates common tasks ├── 📂 .github/ # GitHub Actions workflows (CI/CD) │ ├── 📂 actions/ │ └── 📂 workflows/ On the other hand, the src layout (src is the contraction of source) organizes the source code inside a dedicated src/ directory, preventing accidental imports from the working directory and ensuring a clear separation between source files and other project components like tests or configuration files. This layout is ideal for large projects, libraries, and production-ready applications as it enforces proper package installation and avoids import conflicts. 📂 my-project/ ├── 📂 src/ # Main source code │ ├── 📂 my_project/ # Main package │ │ ├── 🐍 __init__.py # Makes the folder a package │ │ ├── 🐍 main.py # Main entry point (if needed) │ │ ├── 🐍 module1.py # Example module │ │ └── … │ │ ├── 📂 utils/ # Utility functions │ │ │ ├── 🐍 __init__.py │ │ │ ├── 🐍 data_utils.py # data functions │ │ │ ├── 🐍 io_utils.py # Input/output functions │ │ │ └── … ├── 📂 tests/ # Unit tests │ ├── 🐍 test_module1.py │ ├── 🐍 test_module2.py │ ├── 🐍 conftest.py # Pytest configurations │ └── … ├── 📂 docs/ # Documentation │ ├── 📄 index.md │ ├── 📄 architecture.md │ ├── 📄 installation.md │ └── … ├── 📂 notebooks/ # Jupyter Notebooks for exploration │ ├── 📄 exploration.ipynb │ └── … ├── 📂 scripts/ # Standalone scripts (ETL, data processing) │ ├── 🐍 run_pipeline.py │ ├── 🐍 clean_data.py │ └── … ├── 📂 data/ # Raw or processed data (if applicable) │ ├── 📂 raw/ │ ├── 📂 processed/ │ └── …. ├── 📄 .gitignore # Git ignored files ├── 📄 pyproject.toml # Project configuration (Poetry, setuptools) ├── 📄 uv.lock # UV file ├── 📄 README.md # Main project documentation ├── 🐍 setup.py # Installation script (if applicable) ├── 📄 LICENSE # Project license ├── 📄 Makefile # Automates common tasks ├── 📄 DockerFile # To create Docker image ├── 📂 .github/ # GitHub Actions workflows (CI/CD) │ ├── 📂 actions/ │ └── 📂 workflows/ Choosing between these layouts depends on the project’s complexity and long-term goals. For production-quality code, the src/ layout is often recommended, whereas the flat layout works well for simple or short-lived projects. You can imagine different templates that are better adapted to your use case. It is important that you maintain the modularity of your project. Do not hesitate to create subdirectories and to group together scripts with similar functionalities and separate those with different uses. A good code structure ensures readability, maintainability, scalability and reusability and helps to identify and correct errors efficiently. Cookiecutter is an open-source tool for generating preconfigured project structures from templates. It is particularly useful for ensuring the coherence and organization of projects, especially in Python, by applying good practices from the outset. The flat layout and src layout can be initiate using a UV tool. The SOLID principles SOLID programming is an essential approach to software development based on five basic principles for improving code quality, maintainability and scalability. These principles provide a clear framework for developing robust, flexible systems. By following the Solid Principles, you reduce the risk of complex dependencies, make testing easier and ensure that applications can evolve more easily in the face of change. Whether you are working on a single project or a large-scale application, mastering SOLID is an important step towards adopting object-oriented programming best practices. S — Single Responsibility Principle (SRP) The principle of single responsibility means that a class/function can only manage one thing. This means that it only has one reason to change. This makes the code more maintainable and easier to read. A class/function with multiple responsibilities is difficult to understand and often a source of errors. Example: # Violates SRP class MLPipeline:     def __init__(self, df: pd.DataFrame, target_column: str):         self.df = df         self.target_column = target_column         self.scaler = StandardScaler()         self.model = RandomForestClassifier()         def preprocess_data(self):         self.df.fillna(self.df.mean(), inplace=True)  # Handle missing values         X = self.df.drop(columns=[self.target_column])         y = self.df[self.target_column]         X_scaled = self.scaler.fit_transform(X)  # Feature scaling         return X_scaled, y         def train_model(self):         X, y = self.preprocess_data()  # Data preprocessing inside model training         self.model.fit(X, y)         print(“Model training complete.”) Here, the Report class has two responsibilities: Generate content and save the file. # Follows SRP class DataPreprocessor:     def __init__(self):         self.scaler = StandardScaler()         def preprocess(self, df: pd.DataFrame, target_column: str):         df = df.copy()         df.fillna(df.mean(), inplace=True)  # Handle missing values         X = df.drop(columns=[target_column])         y = df[target_column]         X_scaled = self.scaler.fit_transform(X)  # Feature scaling         return X_scaled, y class ModelTrainer:     def __init__(self, model):         self.model = model         def train(self, X, y):         self.model.fit(X, y)         print(“Model training complete.”) O — Open/Closed Principle (OCP) The open/close principle means that a class/function must be open to extension, but closed to modification. This makes it possible to add functionality without the risk of breaking existing code. It is not easy to develop with this principle in mind, but a good indicator for the main developer is to see more and more additions (+) and fewer and fewer removals (-) in the merge requests during project development. L — Liskov Substitution Principle (LSP) The Liskov substitution principle states that a subordinate class can replace its parent class without changing the behavior of the program, ensuring that the subordinate class meets the expectations defined by the base class. It limits the risk of unexpected errors. Example : # Violates LSP class Rectangle: def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height class Square(Rectangle): def __init__(self, side): super().__init__(side, side) # Changing the width of a square violates the idea of a square. To respect the LSP, it is better to avoid this hierarchy and use independent classes: class Shape: def area(self): raise NotImplementedError class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height class Square(Shape): def __init__(self, side): self.side = side def area(self): return self.side * self.side I — Interface Segregation Principle (ISP) The principle of interface separation states that several small classes should be built instead of one with methods that cannot be used in certain cases. This reduces unnecessary dependencies. Example: # Violates ISP class Animal: def fly(self): raise NotImplementedError def swim(self): raise NotImplementedError It is better to split the class Animal into several classes: # Follows ISP class CanFly:     def fly(self):         raise NotImplementedError class CanSwim:     def swim(self):         raise NotImplementedError class Bird(CanFly):     def fly(self):         print(“Flying”) class Fish(CanSwim):     def swim(self):         print(“Swimming”) D — Dependency Inversion Principle (DIP) The Dependency Inversion Principle means that a class must depend on an abstract class and not on a concrete class. This reduces the connections between the classes and makes the code more modular. Example: # Violates DIP class Database: def connect(self): print(“Connecting to database”) class UserService: def __init__(self): self.db = Database() def get_users(self): self.db.connect() print(“Getting users”) Here, the attribute db of UserService depends on the class Database. To respect the DIP, db has to depend on an abstract class. # Follows DIP class DatabaseInterface:     def connect(self):         raise NotImplementedError class MySQLDatabase(DatabaseInterface):     def connect(self):         print(“Connecting to MySQL database”) class UserService:     def __init__(self, db: DatabaseInterface):         self.db = db     def get_users(self):         self.db.connect()         print(“Getting users”) # We can easily change the used database. db = MySQLDatabase() service = UserService(db) service.get_users() PEP standards PEPs (Python Enhancement Proposals) are technical and informative documents that describe new features, language improvements or guidelines for the Python community. Among them, PEP 8, which defines style conventions for Python code, plays a fundamental role in promoting readability and consistency in projects. Adopting the PEP standards, especially PEP 8, not only ensures that the code is understandable to other developers, but also that it conforms to the standards set by the community. This facilitates collaboration, re-reads and long-term maintenance. In this article, I present the most important aspects of the PEP standards, including: Style Conventions (PEP 8): Indentations, variable names and import organization. Best practices for documenting code (PEP 257). Recommendations for writing typed, maintainable code (PEP 484 and PEP 563). Understanding and applying these standards is essential to take full advantage of the Python ecosystem and contribute to professional quality projects. PEP 8 This documentation is about coding conventions to standardize the code, and there exists a lot of documentation about the PEP 8. I will not show all recommendation in this posts, only those that I judge essential when I review a code Naming conventions Variable, function and module names should be in lower case, and use underscore to separate words. This typographical convention is called snake_case. my_variable my_new_function() my_module Constances are written in capital letters and set at the beginning of the script (after the imports): LIGHT_SPEED MY_CONSTANT Finally, class names and exceptions use the CamelCase format (a capital letter at the beginning of each word). Exceptions must contain an Error at the end. MyGreatClass MyGreatError Remember to give your variables names that make sense! Don’t use variable names like v1, v2, func1, i, toto… Single-character variable names are permitted for loops and indexes: my_list = [1, 3, 5, 7, 9, 11] for i in range(len(my_liste)):     print(my_list[i]) A more “pythonic” way of writing, to be preferred to the previous example, gets rid of the i index: my_list = [1, 3, 5, 7, 9, 11] for element in my_list: print(element ) Spaces management It is recommended surrounding operators (+, -, *, /, //, %, ==, !=, >, not, in, and, or, …) with a space before AND after: # recommended code: my_variable = 3 + 7 my_text = “mouse” my_text == my_variable # not recommended code: my_variable=3+7 my_text=”mouse” my_text== ma_variable You can’t add several spaces around an operator. On the other hand, there are no spaces inside square brackets, braces or parentheses: # recommended code: my_list[1] my_dict{“key”} my_function(argument) # not recommended code: my_list[ 1 ] my_dict{ “key” } my_function( argument ) A space is recommended after the characters “:” and “,”, but not before: # recommended code: my_list= [1, 2, 3] my_dict= {“key1”: “value1”, “key2”: “value2”} my_function(argument1, argument2) # not recommended code: my_list= [1 , 2 , 3] my_dict= {“key1″:”value1”, “key2″:”value2”} my_function(argument1 , argument2) However, when indexing lists, we don’t put a space after the “:”: my_list= [1, 3, 5, 7, 9, 1] # recommended code: my_list[1:3] my_list[1:4:2] my_list[::2] # not recommended code: my_list[1 : 3] my_list[1: 4:2 ] my_list[ : :2] Line length For the sake of readability, we recommend writing lines of code no longer than 80 characters long. However, in certain circumstances this rule can be broken, especially if you are working on a Dash project, it may be complicated to respect this recommendation  The character can be used to cut lines that are too long. For example: my_variable = 3 if my_variable > 1 and my_variable > > my_function.__doc__ > > > ‘This is a doctring.’ We always write a docstring between triple double quote “””. Docstring on a line Used for simple functions or methods, it must fit on a single line, with no blank line at the beginning or end. The closing quotes are on the same line as opening quotes and there are no blank lines before or after the docstring. def add(a, b): “””Return the sum of a and b.””” return a + b Single-line docstring MUST NOT reintegrate function/method parameters. Do not do: def my_function(a, b): “”” my_function(a, b) – > list””” Docstring on several lines The first line should be a summary of the object being documented. An empty line follows, followed by more detailed explanations or clarifications of the arguments. def divide(a, b):     “””Divide a byb.     Returns the result of the division. Raises a ValueError if b equals 0.     “””     if b == 0:         raise ValueError(“Only Chuck Norris can divide by 0”) return a / b Complete Docstring A complete docstring is made up of several parts (in this case, based on the numpydoc standard). Short description: Summarizes the main functionality. Parameters: Describes the arguments with their type, name and role. Returns: Specifies the type and role of the returned value. Raises: Documents exceptions raised by the function. Notes (optional): Provides additional explanations. Examples (optional): Contains illustrated usage examples with expected results or exceptions. def calculate_mean(numbers: list[float]) – > float:     “””     Calculate the mean of a list of numbers.     Parameters     ———-     numbers : list of float         A list of numerical values for which the mean is to be calculated.     Returns     ——-     float         The mean of the input numbers.     Raises     ——     ValueError         If the input list is empty.     Notes     —–     The mean is calculated as the sum of all elements divided by the number of elements.     Examples     ——–     Calculate the mean of a list of numbers:     > > > calculate_mean([1.0, 2.0, 3.0, 4.0])     2.5 Tool to help you VsCode’s autoDocstring extension lets you automatically create a docstring template. PEP 484 In some programming languages, typing is mandatory when declaring a variable. In Python, typing is optional, but strongly recommended. PEP 484 introduces a typing system for Python, annotating the types of variables, function arguments and return values. This PEP provides a basis for improving code readability, facilitating static analysis and reducing errors. What is typing? Typing consists in explicitly declaring the type (float, string, etc.) of a variable. The typing module provides standard tools for defining generic types, such as Sequence, List, Union, Any, etc. To type function attributes, we use “:” for function arguments and “- >” for the type of what is returned. Here a list of none typing functions: def show_message(message):     print(f”Message : {message}”) def addition(a, b):     return a + b def is_even(n):     return n % 2 == 0 def list_square(numbers):       return [x**2 for x in numbers] def reverse_dictionary(d):     return {v: k for k, v in d.items()} def add_element(ensemble, element):     ensemble.add(element)   return ensemble Now here’s how they should look: from typing import List, Tuple, Dict, Set, Any def show _message(message: str) – > None:     print(f”Message : {message}”) def addition(a: int, b: int) – > int:     return a + b def is_even(n: int) – > bool:     return n % 2 == 0 def list_square (numbers: List[int]) – > List[int]:     return [x**2 for x in numbers] def reverse_dictionary (d: Dict[str, int]) – > Dict[int, str]:     return {v: k for k, v in d.items()} def add_element(ensemble: Set[int], element: int) – > Set[int]:     ensemble.add(element)     return ensemble Tool to help you The MyPy extension automatically checks whether the use of a variable corresponds to the declared type. For example, for the following function: def my_function(x: float) – > float: return x.mean() The editor will point out that a float has no “mean” attribute. Image from author The benefit is twofold: you’ll know whether the declared type is the right one and whether the use of this variable corresponds to its type. In the above example, x must be of a type that has a mean() method (e.g. np.array). Conclusion In this article, we have looked at the most important principles for creating clean Python production code. A solid architecture, adherence to SOLID principles, and compliance with PEP recommendations (at least the four discussed here) are essential for ensuring code quality. The desire for beautiful code is not (just) coquetry. It standardizes development practices and makes teamwork and maintenance much easier. There’s nothing more frustrating than spending hours (or even days) reverse-engineering a program, deciphering poorly written code before you’re finally able to fix the bugs. By applying these best practices, you ensure that your code remains clear, scalable, and easy for any developer to work with in the future. References 1. src layout vs flat layout 2. SOLID principles 3. Python Enhancement Proposals index

In my previous article, I highlighted the importance of effective project management in Python development. Now, let’s shift our focus to the code itself and explore how to write clean, maintainable code — an essential practice in professional and collaborative environments. 

  • Readability & Maintainability: Well-structured code is easier to read, understand, and modify. Other developers — or even your future self — can quickly grasp the logic without struggling to decipher messy code.
  • Debugging & Troubleshooting: Organized code with clear variable names and structured functions makes it easier to identify and fix bugs efficiently.
  • Scalability & Reusability: Modular, well-organized code can be reused across different projects, allowing for seamless scaling without disrupting existing functionality.

So, as you work on your next Python project, remember: 

Half of good code is Clean Code.


Introduction

Python is one of the most popular and versatile Programming languages, appreciated for its simplicity, comprehensibility and large community. Whether web development, data analysis, artificial intelligence or automation of tasks — Python offers powerful and flexible tools that are suitable for a wide range of areas.

However, the efficiency and maintainability of a Python project depends heavily on the practices used by the developers. Poor structuring of the code, a lack of conventions or even a lack of documentation can quickly turn a promising project into a maintenance and development-intensive puzzle. It is precisely this point that makes the difference between student code and professional code.

This article is intended to present the most important best practices for writing high-quality Python code. By following these recommendations, developers can create scripts and applications that are not only functional, but also readable, performant and easily maintainable by third parties.

Adopting these best practices right from the start of a project not only ensures better collaboration within teams, but also prepares your code to evolve with future needs. Whether you’re a beginner or an experienced developer, this guide is designed to support you in all your Python developments.


The code structuration

Good code structuring in Python is essential. There are two main project layouts: flat layout and src layout.

The flat layout places the source code directly in the project root without an additional folder. This approach simplifies the structure and is well-suited for small scripts, quick prototypes, and projects that do not require complex packaging. However, it may lead to unintended import issues when running tests or scripts.

📂 my_project/
├── 📂 my_project/                  # Directly in the root
│   ├── 🐍 __init__.py
│   ├── 🐍 main.py                   # Main entry point (if needed)
│   ├── 🐍 module1.py             # Example module
│   └── 🐍 utils.py
├── 📂 tests/                            # Unit tests
│   ├── 🐍 test_module1.py
│   ├── 🐍 test_utils.py
│   └── ...
├── 📄 .gitignore                      # Git ignored files
├── 📄 pyproject.toml              # Project configuration (Poetry, setuptools)
├── 📄 uv.lock                         # UV file
├── 📄 README.md               # Main project documentation
├── 📄 LICENSE                     # Project license
├── 📄 Makefile                       # Automates common tasks
├── 📄 DockerFile                   # Automates common tasks
├── 📂 .github/                        # GitHub Actions workflows (CI/CD)
│   ├── 📂 actions/               
│   └── 📂 workflows/

On the other hand, the src layout (src is the contraction of source) organizes the source code inside a dedicated src/ directory, preventing accidental imports from the working directory and ensuring a clear separation between source files and other project components like tests or configuration files. This layout is ideal for large projects, libraries, and production-ready applications as it enforces proper package installation and avoids import conflicts.

📂 my-project/
├── 📂 src/                              # Main source code
│   ├── 📂 my_project/            # Main package
│   │   ├── 🐍 __init__.py        # Makes the folder a package
│   │   ├── 🐍 main.py             # Main entry point (if needed)
│   │   ├── 🐍 module1.py       # Example module
│   │   └── ...
│   │   ├── 📂 utils/                  # Utility functions
│   │   │   ├── 🐍 __init__.py     
│   │   │   ├── 🐍 data_utils.py  # data functions
│   │   │   ├── 🐍 io_utils.py      # Input/output functions
│   │   │   └── ...
├── 📂 tests/                             # Unit tests
│   ├── 🐍 test_module1.py     
│   ├── 🐍 test_module2.py     
│   ├── 🐍 conftest.py              # Pytest configurations
│   └── ...
├── 📂 docs/                            # Documentation
│   ├── 📄 index.md                
│   ├── 📄 architecture.md         
│   ├── 📄 installation.md         
│   └── ...                     
├── 📂 notebooks/                   # Jupyter Notebooks for exploration
│   ├── 📄 exploration.ipynb       
│   └── ...                     
├── 📂 scripts/                         # Standalone scripts (ETL, data processing)
│   ├── 🐍 run_pipeline.py         
│   ├── 🐍 clean_data.py           
│   └── ...                     
├── 📂 data/                            # Raw or processed data (if applicable)
│   ├── 📂 raw/                    
│   ├── 📂 processed/
│   └── ....                                 
├── 📄 .gitignore                      # Git ignored files
├── 📄 pyproject.toml              # Project configuration (Poetry, setuptools)
├── 📄 uv.lock                         # UV file
├── 📄 README.md               # Main project documentation
├── 🐍 setup.py                       # Installation script (if applicable)
├── 📄 LICENSE                     # Project license
├── 📄 Makefile                       # Automates common tasks
├── 📄 DockerFile                   # To create Docker image
├── 📂 .github/                        # GitHub Actions workflows (CI/CD)
│   ├── 📂 actions/               
│   └── 📂 workflows/

Choosing between these layouts depends on the project’s complexity and long-term goals. For production-quality code, the src/ layout is often recommended, whereas the flat layout works well for simple or short-lived projects.

You can imagine different templates that are better adapted to your use case. It is important that you maintain the modularity of your project. Do not hesitate to create subdirectories and to group together scripts with similar functionalities and separate those with different uses. A good code structure ensures readability, maintainability, scalability and reusability and helps to identify and correct errors efficiently.

Cookiecutter is an open-source tool for generating preconfigured project structures from templates. It is particularly useful for ensuring the coherence and organization of projects, especially in Python, by applying good practices from the outset. The flat layout and src layout can be initiate using a UV tool.


The SOLID principles

SOLID programming is an essential approach to software development based on five basic principles for improving code quality, maintainability and scalability. These principles provide a clear framework for developing robust, flexible systems. By following the Solid Principles, you reduce the risk of complex dependencies, make testing easier and ensure that applications can evolve more easily in the face of change. Whether you are working on a single project or a large-scale application, mastering SOLID is an important step towards adopting object-oriented programming best practices.

S — Single Responsibility Principle (SRP)

The principle of single responsibility means that a class/function can only manage one thing. This means that it only has one reason to change. This makes the code more maintainable and easier to read. A class/function with multiple responsibilities is difficult to understand and often a source of errors.

Example:

# Violates SRP
class MLPipeline:
    def __init__(self, df: pd.DataFrame, target_column: str):
        self.df = df
        self.target_column = target_column
        self.scaler = StandardScaler()
        self.model = RandomForestClassifier()
        def preprocess_data(self):
        self.df.fillna(self.df.mean(), inplace=True)  # Handle missing values
        X = self.df.drop(columns=[self.target_column])
        y = self.df[self.target_column]
        X_scaled = self.scaler.fit_transform(X)  # Feature scaling
        return X_scaled, y
        def train_model(self):
        X, y = self.preprocess_data()  # Data preprocessing inside model training
        self.model.fit(X, y)
        print("Model training complete.")

Here, the Report class has two responsibilities: Generate content and save the file.

# Follows SRP
class DataPreprocessor:
    def __init__(self):
        self.scaler = StandardScaler()
        def preprocess(self, df: pd.DataFrame, target_column: str):
        df = df.copy()
        df.fillna(df.mean(), inplace=True)  # Handle missing values
        X = df.drop(columns=[target_column])
        y = df[target_column]
        X_scaled = self.scaler.fit_transform(X)  # Feature scaling
        return X_scaled, y


class ModelTrainer:
    def __init__(self, model):
        self.model = model
        def train(self, X, y):
        self.model.fit(X, y)
        print("Model training complete.")

O — Open/Closed Principle (OCP)

The open/close principle means that a class/function must be open to extension, but closed to modification. This makes it possible to add functionality without the risk of breaking existing code.

It is not easy to develop with this principle in mind, but a good indicator for the main developer is to see more and more additions (+) and fewer and fewer removals (-) in the merge requests during project development.

L — Liskov Substitution Principle (LSP)

The Liskov substitution principle states that a subordinate class can replace its parent class without changing the behavior of the program, ensuring that the subordinate class meets the expectations defined by the base class. It limits the risk of unexpected errors.

Example :

# Violates LSP
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height


class Square(Rectangle):
    def __init__(self, side):
        super().__init__(side, side)
# Changing the width of a square violates the idea of a square.

To respect the LSP, it is better to avoid this hierarchy and use independent classes:

class Shape:
    def area(self):
        raise NotImplementedError


class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height


class Square(Shape):
    def __init__(self, side):
        self.side = side

    def area(self):
        return self.side * self.side

I — Interface Segregation Principle (ISP)

The principle of interface separation states that several small classes should be built instead of one with methods that cannot be used in certain cases. This reduces unnecessary dependencies.

Example:

# Violates ISP
class Animal:
    def fly(self):
        raise NotImplementedError

    def swim(self):
        raise NotImplementedError

It is better to split the class Animal into several classes:

# Follows ISP
class CanFly:
    def fly(self):
        raise NotImplementedError


class CanSwim:
    def swim(self):
        raise NotImplementedError


class Bird(CanFly):
    def fly(self):
        print("Flying")


class Fish(CanSwim):
    def swim(self):
        print("Swimming")

D — Dependency Inversion Principle (DIP)

The Dependency Inversion Principle means that a class must depend on an abstract class and not on a concrete class. This reduces the connections between the classes and makes the code more modular.

Example:

# Violates DIP
class Database:
    def connect(self):
        print("Connecting to database")


class UserService:
    def __init__(self):
        self.db = Database()

    def get_users(self):
        self.db.connect()
        print("Getting users")

Here, the attribute db of UserService depends on the class Database. To respect the DIP, db has to depend on an abstract class.

# Follows DIP
class DatabaseInterface:
    def connect(self):
        raise NotImplementedError


class MySQLDatabase(DatabaseInterface):
    def connect(self):
        print("Connecting to MySQL database")


class UserService:
    def __init__(self, db: DatabaseInterface):
        self.db = db

    def get_users(self):
        self.db.connect()
        print("Getting users")


# We can easily change the used database.
db = MySQLDatabase()
service = UserService(db)
service.get_users()

PEP standards

PEPs (Python Enhancement Proposals) are technical and informative documents that describe new features, language improvements or guidelines for the Python community. Among them, PEP 8, which defines style conventions for Python code, plays a fundamental role in promoting readability and consistency in projects.

Adopting the PEP standards, especially PEP 8, not only ensures that the code is understandable to other developers, but also that it conforms to the standards set by the community. This facilitates collaboration, re-reads and long-term maintenance.

In this article, I present the most important aspects of the PEP standards, including:

  • Style Conventions (PEP 8): Indentations, variable names and import organization.
  • Best practices for documenting code (PEP 257).
  • Recommendations for writing typed, maintainable code (PEP 484 and PEP 563).

Understanding and applying these standards is essential to take full advantage of the Python ecosystem and contribute to professional quality projects.


PEP 8

This documentation is about coding conventions to standardize the code, and there exists a lot of documentation about the PEP 8. I will not show all recommendation in this posts, only those that I judge essential when I review a code

Naming conventions

Variable, function and module names should be in lower case, and use underscore to separate words. This typographical convention is called snake_case.

my_variable
my_new_function()
my_module

Constances are written in capital letters and set at the beginning of the script (after the imports):

LIGHT_SPEED
MY_CONSTANT

Finally, class names and exceptions use the CamelCase format (a capital letter at the beginning of each word). Exceptions must contain an Error at the end.

MyGreatClass
MyGreatError

Remember to give your variables names that make sense! Don’t use variable names like v1, v2, func1, i, toto…

Single-character variable names are permitted for loops and indexes:

my_list = [1, 3, 5, 7, 9, 11]
for i in range(len(my_liste)):
    print(my_list[i])

A more “pythonic” way of writing, to be preferred to the previous example, gets rid of the i index:

my_list = [1, 3, 5, 7, 9, 11]
for element in my_list:
    print(element )

Spaces management

It is recommended surrounding operators (+, -, *, /, //, %, ==, !=, >, not, in, and, or, …) with a space before AND after:

# recommended code:
my_variable = 3 + 7
my_text = "mouse"
my_text == my_variable

# not recommended code:
my_variable=3+7
my_text="mouse"
my_text== ma_variable

You can’t add several spaces around an operator. On the other hand, there are no spaces inside square brackets, braces or parentheses:

# recommended code:
my_list[1]
my_dict{"key"}
my_function(argument)

# not recommended code:
my_list[ 1 ]
my_dict{ "key" }
my_function( argument )

A space is recommended after the characters “:” and “,”, but not before:

# recommended code:
my_list= [1, 2, 3]
my_dict= {"key1": "value1", "key2": "value2"}
my_function(argument1, argument2)

# not recommended code:
my_list= [1 , 2 , 3]
my_dict= {"key1":"value1", "key2":"value2"}
my_function(argument1 , argument2)

However, when indexing lists, we don’t put a space after the “:”:

my_list= [1, 3, 5, 7, 9, 1]

# recommended code:
my_list[1:3]
my_list[1:4:2]
my_list[::2]

# not recommended code:
my_list[1 : 3]
my_list[1: 4:2 ]
my_list[ : :2]

Line length

For the sake of readability, we recommend writing lines of code no longer than 80 characters long. However, in certain circumstances this rule can be broken, especially if you are working on a Dash project, it may be complicated to respect this recommendation 

The character can be used to cut lines that are too long.

For example:

my_variable = 3
if my_variable > 1 and my_variable < 10 
    and my_variable % 2 == 1 and my_variable % 3 == 0:
    print(f"My variable is equal to {my_variable }")

Within a parenthesis, you can return to the line without using the character. This can be useful for specifying the arguments of a function or method when defining or using it:

def my_function(argument_1, argument_2,
                argument_3, argument_4):
    return argument_1 + argument_2

It is also possible to create multi-line lists or dictionaries by skipping a line after a comma:

my_list = [1, 2, 3,
          4, 5, 6,
          7, 8, 9]
my_dict = {"key1": 13,
          "key2": 42,
          "key2": -10}

Blank lines

In a script, blank lines are useful for visually separating different parts of the code. It is recommended to leave two blank lines before the definition of a function or class, and to leave a single blank line before the definition of a method (in a class). You can also leave a blank line in the body of a function to separate the logical sections of the function, but this should be used sparingly.

Comments

Comments always begin with the # symbol followed by a space. They give clear explanations of the purpose of the code and must be synchronized with the code, i.e. if the code is modified, the comments must be too (if applicable). They are on the same indentation level as the code they comment on. Comments are complete sentences, with a capital letter at the beginning (unless the first word is a variable, which is written without a capital letter) and a period at the end.I strongly recommend writing comments in English and it is important to be consistent between the language used for comments and the language used to name variables. Finally, Comments that follow the code on the same line should be avoided wherever possible, and should be separated from the code by at least two spaces.

Tool to help you

Ruff is a linter (code analysis tool) and formatter for Python code written in Rust. It combines the advantages of the flake8 linter and black and isort formatting while being faster.

Ruff has an extension on the VS Code editor.

To check your code you can type:

ruff check my_modul.py

But, it is also possible to correct it with the following command:

ruff format my_modul.py

PEP 20

PEP 20: The Zen of Python is a set of 19 principles written in poetic form. They are more a way of coding than actual guidelines.

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

PEP 257

The aim of PEP 257 is to standardize the use of docstrings.

What is a docstring?

A docstring is a string that appears as the first instruction after the definition of a function, class or method. A docstring becomes the output of the __doc__ special attribute of this object.

def my_function():
    """This is a doctring."""
    pass

And we have:

>>> my_function.__doc__
>>> 'This is a doctring.'

We always write a docstring between triple double quote """.

Docstring on a line

Used for simple functions or methods, it must fit on a single line, with no blank line at the beginning or end. The closing quotes are on the same line as opening quotes and there are no blank lines before or after the docstring.

def add(a, b):
    """Return the sum of a and b."""
    return a + b

Single-line docstring MUST NOT reintegrate function/method parameters. Do not do:

def my_function(a, b):
    """ my_function(a, b) -> list"""

Docstring on several lines

The first line should be a summary of the object being documented. An empty line follows, followed by more detailed explanations or clarifications of the arguments.

def divide(a, b):
    """Divide a byb.

    Returns the result of the division. Raises a ValueError if b equals 0.
    """
    if b == 0:
        raise ValueError("Only Chuck Norris can divide by 0") return a / b

Complete Docstring

A complete docstring is made up of several parts (in this case, based on the numpydoc standard).

  1. Short description: Summarizes the main functionality.
  2. Parameters: Describes the arguments with their type, name and role.
  3. Returns: Specifies the type and role of the returned value.
  4. Raises: Documents exceptions raised by the function.
  5. Notes (optional): Provides additional explanations.
  6. Examples (optional): Contains illustrated usage examples with expected results or exceptions.
def calculate_mean(numbers: list[float]) -> float:
    """
    Calculate the mean of a list of numbers.

    Parameters
    ----------
    numbers : list of float
        A list of numerical values for which the mean is to be calculated.

    Returns
    -------
    float
        The mean of the input numbers.

    Raises
    ------
    ValueError
        If the input list is empty.

    Notes
    -----
    The mean is calculated as the sum of all elements divided by the number of elements.

    Examples
    --------
    Calculate the mean of a list of numbers:
    >>> calculate_mean([1.0, 2.0, 3.0, 4.0])
    2.5

Tool to help you

VsCode’s autoDocstring extension lets you automatically create a docstring template.

PEP 484

In some programming languages, typing is mandatory when declaring a variable. In Python, typing is optional, but strongly recommended. PEP 484 introduces a typing system for Python, annotating the types of variables, function arguments and return values. This PEP provides a basis for improving code readability, facilitating static analysis and reducing errors.

What is typing?

Typing consists in explicitly declaring the type (float, string, etc.) of a variable. The typing module provides standard tools for defining generic types, such as Sequence, List, Union, Any, etc.

To type function attributes, we use “:” for function arguments and “->” for the type of what is returned.

Here a list of none typing functions:

def show_message(message):
    print(f"Message : {message}")

def addition(a, b):
    return a + b

def is_even(n):
    return n % 2 == 0

def list_square(numbers):
      return [x**2 for x in numbers]

def reverse_dictionary(d):
    return {v: k for k, v in d.items()}

def add_element(ensemble, element):
    ensemble.add(element)
  return ensemble

Now here’s how they should look:

from typing import List, Tuple, Dict, Set, Any

def show _message(message: str) -> None:
    print(f"Message : {message}")

def addition(a: int, b: int) -> int:
    return a + b

def is_even(n: int) -> bool:
    return n % 2 == 0

def list_square (numbers: List[int]) -> List[int]:
    return [x**2 for x in numbers]

def reverse_dictionary (d: Dict[str, int]) -> Dict[int, str]:
    return {v: k for k, v in d.items()}

def add_element(ensemble: Set[int], element: int) -> Set[int]:
    ensemble.add(element)
    return ensemble

Tool to help you

The MyPy extension automatically checks whether the use of a variable corresponds to the declared type. For example, for the following function:

def my_function(x: float) -> float:
    return x.mean()

The editor will point out that a float has no “mean” attribute.

Image from author

The benefit is twofold: you’ll know whether the declared type is the right one and whether the use of this variable corresponds to its type.

In the above example, x must be of a type that has a mean() method (e.g. np.array).


Conclusion

In this article, we have looked at the most important principles for creating clean Python production code. A solid architecture, adherence to SOLID principles, and compliance with PEP recommendations (at least the four discussed here) are essential for ensuring code quality. The desire for beautiful code is not (just) coquetry. It standardizes development practices and makes teamwork and maintenance much easier. There’s nothing more frustrating than spending hours (or even days) reverse-engineering a program, deciphering poorly written code before you’re finally able to fix the bugs. By applying these best practices, you ensure that your code remains clear, scalable, and easy for any developer to work with in the future.


References

1. src layout vs flat layout

2. SOLID principles

3. Python Enhancement Proposals index

Shape
Shape
Stay Ahead

Explore More Insights

Stay ahead with more perspectives on cutting-edge power, infrastructure, energy,  bitcoin and AI solutions. Explore these articles to uncover strategies and insights shaping the future of industries.

Shape

EPA to end environmental justice programs, monitoring tools

Dive Brief: The Trump administration announced Wednesday it will shut down all environmental justice offices and officially end other EJ-related initiatives, a move that will impact how waste and recycling industries measure and track their environmental impact on neighboring communities. The closures include the EPA’s Office of Environmental Justice and

Read More »

Intel under Tan: What enterprise IT buyers need to know

Intel’s discrete GPU ambitions — especially in enterprise AI — have often appeared reactive rather than part of a clear strategic vision. The company entered the market late, facing Nvidia’s dominant CUDA ecosystem and AMD’s aggressive push into AI GPUs. “Tan’s background suggests he is unlikely to double down on

Read More »

SUSE expands AI tools to control workloads, LLM usage

“And every few weeks we’ll continue to add to the library,” Puri says. SUSE also announced a partnership with Infosys today. The system integrator has the Topaz AI platform, which includes a set of services and solutions to help enterprises build and deploy AI applications. SUSE is also integrating the

Read More »

D-Wave uses quantum to solve real-world problem

D-Wave published its results today, peer-reviewed in the journal Science. The classical supercomputer that D-Wave benchmarked against was the Frontier supercomputer at the Department of Energy’s Oak Ridge National Laboratory. It was, until recently, the most powerful supercomputer in the world but moved to second place in November. Two different

Read More »

Crude Edges Higher After Seven Weeks of Declines

Oil snapped a seven-week losing streak as US equity markets rebounded and peace talks between Russia and Ukraine stalled, damping expectations that Moscow’s crude will return to the market soon. West Texas Intermediate rose almost 1% to settle above $67 a barrel, supported by a weaker dollar and an advance in US equities. Brent climbed to settle below $71. Russian President Vladimir Putin said Ukrainian troops in the Kursk region should lay down their arms, and Ukraine pushed back on the request, raising doubts about how soon a ceasefire could be achieved. US crude eked out a 0.2% gain for the week, barely skirting an eighth straight weekly decline that would have been its longest such losing streak since 2015. US President Donald Trump’s salvos against the country’s major trading partners have weighed on crude prices since mid-January, raising the prospect of sputtering economic growth and falling oil consumption. Long-term inflation expectations jumped by the most since 1993, painting a gloomy picture for future energy demand. US crude earlier rose as much as 1.4% after the White House imposed sanctions on Iran’s oil minister and on more companies and vessels used by the OPEC member, while also restricting payment options for Russian energy, before paring the gains. Still, the ceasefire negotiations unfolding between Russia and Ukraine, as well as macroeconomic risk, are holding traders’ attention for now, said Rebecca Babin, senior energy trader at CIBC Private Wealth Group. The sanctions developments are “all just words until they’re enforced, so the market is less reactive to the headlines recently,” Babin said. The potential return of Russian barrels comes amid projections the market already is headed for an oversupply. The IEA forecasts the global supply surplus is set to deepen as an escalating trade war pressures demand at the same time that

Read More »

Qatar Supplies Syria With Natural Gas in Latest Post-Assad Boost

Qatar began supplying natural gas to Syria through Jordan, the latest boost to the war-torn country’s interim government following the fall of former president Bashar al-Assad. About 2 million cubic meters a day will be sent via the Arab Gas Pipeline, eventually contributing a total of 400 megawatts to the power grid, Syrian state-run news agency Sana said. The supplies were approved by Washington, Reuters reported earlier, without providing numbers.  The contract signals further recognition for the government of Ahmed Al-Sharaa, who led the battle to overthrow Assad. It should help increase average power supply for Syrians to four hours a day, up from two, helping ease severe energy shortages. The UK removed the Syrian central bank and 23 other entities, mainly lenders and energy companies, from a list of sanctioned institutions earlier this month, following similar moves by several Western countries. Natural gas supplies through the Arab Gas Pipeline to Syria, and by extension to Lebanon, have been disrupted since 2011 due to the war and have been largely inactive since then.  The exact mechanism by which Qatar will transport the gas to Syria and reactivate that section of the pipeline is unclear, as years of conflict have damaged vital energy infrastructure. Plus, the only LNG storage facility in Jordan, a vessel off the Red Sea port city of Aqaba, will be leased to Egypt for 10 years starting mid-2025. The power supply hinges on raising the production capacity of Syria’s Deir Ali power station, state-run Qatar News Agency said. This supply level is the “first phase” of a deal signed between Qatar Fund for Development and the Jordanian Ministry of Energy, in cooperation with the United Nations Development Program, which will oversee the “executive aspects of the project”. Syria’s interim government is seeking to replace oil imports from

Read More »

Energy Bosses Shrug Off DeepSeek to Focus on Powering AI Boom

While tariffs and macroeconomic concerns weighed on the outlook for oil at a major energy conference in Houston this week, the mood around artificial intelligence and its sky-high power needs could scarcely be different. For a second year, energy executives at the CERAWeek by S&P Global gathering hailed the looming data center requirements for AI as both a huge challenge and a once-in-a-generation opportunity.  “The only way we win the AI arms race with China is if we have electricity,” US Interior Secretary Doug Burgum said in his address. “They are moving at a speed that would suggest we are in a serious cyberwar with them.” The energy world appears to have shrugged off investor doubts that emerged over the AI-power narrative in January, when Chinese startup DeepSeek released a chat bot purported to use just a fraction of the electricity required by established US rivals. Despite that wobble, many forecasts for US power demand are still unprecedented — and come after more than two decades of stable consumption. Jenny Yang, head of power and renewables research at S&P, told conference delegates Thursday that US utilities’ estimates for additional power demand coming just from data centers by 2030 are equivalent to the entire Ercot power market in Texas. “We’re seeing load forecasts that, in my experience as a state regulator, are mind-boggling,” said Mark Christie, a former energy regulator in Virginia, the data-center capital of the US, and who now chairs the Federal Energy Regulatory Commission. The so-called hyperscalers continue to race ahead with their build-out of AI infrastructure. Google parent Alphabet Inc. reported last month it plans capital expenditures of $75 billion this year.  The power demand related to that spending “is coming so fast and from so many different directions,” Alan Armstrong, chief executive officer of US pipeline operator Williams

Read More »

The Emperor’s New Clothes: BP and Shell’s duck diplomacy

BP’s (LON:BP) undressing of its energy transition goals is the latest and most significant example of an oil supermajor reneging on its green investment pledges. It is easy to speculate that companies such as BP, and similarly Shell (LON:SHEL), have attempted to diversify into renewable energy too quickly. However, diversification in the energy transition could be the very thing that pulls the cart out of danger. This week, BP’s chief executive Murray Auchincloss defended the company’s decision to jettison renewable energy pledges and increase oil and gas production. In late February, he said the oil major had accelerated “too far, too fast” in the transition to renewable energy. “Our optimism for a fast transition was misplaced,” he said, after profits fell across its low-carbon and gas division, precipitating a sudden strategic about-face. The company, which has been under pressure from analysts and shareholders to reduce its low-carbon investments and double down on its core business of oil and gas, plans to cut investment in low-carbon projects by $5 billion (£4bn), Auchincloss said. © Image: BloombergLondon’s Old Oil Stocks Diverge | BP underperforms Shell on worries about green transition, payouts. “The challenge that faces BP and Equinor, and to varying degrees Shell and Equinor, is the marked underperformance of their shares relative to that of their US peers,” says Russ Mould, investment director at AJ Bell. “Whether this is down to the relatively greater emphasis they have placed upon investment in renewables to facilitate a move away from hydrocarbons or simply down to their stock market domicile (given how US equities continue to dominate across the board) is hard to divine, but the truth may well lie somewhere between. There is a sense that shareholders are becoming restless.” BP’s shares have shown a marked underperformance relative to global peers since former

Read More »

Peterhead’s Acorn CCS key to unlocking future of Grangemouth

Grangemouth will need the Acorn Carbon Capture and Storage (CCS) development to go ahead to take full advantage of the upcoming £13 billion Project Willow plan. Colin Pritchard, sustainability and external relations director at Ineos, which runs the Grangemouth refinery Petroineos in a joint venture with PetroChina, said: “If you want to really go for all of the things that are within Willow and take them to the full extent, you will need a CO2 transportation and storage system. “In that case, the full extent of Willow needs Acorn.” Project Willow is the plan currently being developed by the UK and Scottish Governments to ameliorate the closure of the Scotland’s only oil refinery with the expected loss of 400 jobs. Due for release soon, Project Willow  will lay out nine potential projects to overhaul the Grangemouth refinery in Scotland and create a long-term sustainable future for the site. A feasibility study exploring options for overhauling the Grangemouth refinery in Scotland is reportedly set to propose £3.8bn of investments in low-carbon alternatives for the site over ten years, with a best-case scenario could see the amount rise to almost £13bn. These options include recycling plastics, the production of biomethane, sustainable aviation fuel (SAF) and renewable diesel. In turn, these are hoped to avert the shutdown of Grangemouth, scheduled for the second quarter of this year, and preserve jobs at the facility. Speaking to Energy Voice on the side-lines of the DeCarbScotland event, Pritchard added: “There are some projects there are not dependent on Acorn, but there are some projects within Willow, like e-methanol, which are.” He added that the nine projects envisioned in Project Willow are an initial project set and could evolve, making CCS essential “if you want to get the full benefit of what we put in Willow”. Based in

Read More »

EIA Reveals Latest Brent Oil Price Forecast for 2025 and 2026

The U.S. Energy Information Administration (EIA) has revealed its latest Brent spot price forecast for 2025 and 2026 in its March Short Term Energy Outlook (STEO), which was released this week. According to the STEO, the EIA now sees the Brent spot price averaging $74.22 per barrel this year and $68.47 per barrel next year. In its previous STEO, which was released in February, the EIA projected that the Brent spot price would average $74.50 per barrel in 2025 and $66.46 per barrel in 2026. The EIA outlined in its latest STEO that it sees the Brent spot price coming in at $74.89 per barrel in the first quarter of this year, $74.00 per barrel in the second quarter, $75.00 per barrel in the third quarter, $73.02 per barrel in the fourth quarter, $71.00 per barrel in the first quarter of 2026, $69.00 per barrel in the second quarter, $68.00 per barrel in the third quarter, and $66.00 per barrel in the fourth quarter. In its previous February STEO, the EIA forecast that the Brent spot price would average $77.13 per barrel in the first quarter of 2025, $75.00 per barrel in the second quarter, $74.00 per barrel in the third quarter, $72.00 per barrel in the fourth quarter, $68.97 per barrel in the first quarter of 2026, $67.33 per barrel in the second quarter, $65.68 per barrel in the third quarter, and $64.00 per barrel in the fourth quarter of next year. In its latest STEO, the EIA highlighted that the Brent crude oil spot price averaged $75 per barrel in February, which it pointed out was $4 per barrel lower than in January and $8 per barrel lower than at the same time last year. “Crude oil prices fell during February driven largely by economic growth concerns related

Read More »

IBM laying foundation for mainframe as ultimate AI server

“It will truly change what customers are able to do with AI,” Stowell said. IBM’s mainframe processors The next generation of processors is expected to continue a long history of generation-to-generation improvements, IBM stated in a new white paper on AI and the mainframe. “They are projected to clock in at 5.5 GHz. and include ten 36 MB level 2 caches. They’ll feature built-in low-latency data processing for accelerated I/O as well as a completely redesigned cache and chip-interconnection infrastructure for more on-chip cache and compute capacity,” IBM wrote.  Today’s mainframes also have extensions and accelerators that integrate with the core systems. These specialized add-ons are designed to enable the adoption of technologies such as Java, cloud and AI by accelerating computing paradigms that are essential for high-volume, low-latency transaction processing, IBM wrote.  “The next crop of AI accelerators are expected to be significantly enhanced—with each accelerator designed to deliver 4 times more compute power, reaching 24 trillion operations per second (TOPS),” IBM wrote. “The I/O and cache improvements will enable even faster processing and analysis of large amounts of data and consolidation of workloads running across multiple servers, for savings in data center space and power costs. And the new accelerators will provide increased capacity to enable additional transaction clock time to perform enhanced in-transaction AI inferencing.” In addition, the next generation of the accelerator architecture is expected to be more efficient for AI tasks. “Unlike standard CPUs, the chip architecture will have a simpler layout, designed to send data directly from one compute engine, and use a range of lower- precision numeric formats. These enhancements are expected to make running AI models more energy efficient and far less memory intensive. As a result, mainframe users can leverage much more complex AI models and perform AI inferencing at a greater scale

Read More »

VergeIO enhances VergeFabric network virtualization offering

VergeIO is not, however, using an off-the-shelf version of KVM. Rather, it is using what Crump referred to as a heavily modified KVM hypervisor base, with significant proprietary enhancements while still maintaining connections to the open-source community. VergeIO’s deployment profile is currently 70% on premises and about 30% via bare-metal service providers, with a particularly strong following among cloud service providers that host applications for their customers. The software requires direct hardware access due to its low-level integration with physical resources. “Since November of 2023, the normal number one customer we’re attracting right now is guys that have had a heart attack when they got their VMware renewal license,” Crump said. “The more of the stack you own, the better our story becomes.” A 2024 report from Data Center Intelligence Group (DCIG) identified VergeOS as one of the top 5 alternatives to VMware. “VergeIO starts by installing VergeOS on bare metal servers,” the report stated. “It then brings the servers’ hardware resources under its management, catalogs these resources, and makes them available to VMs. By directly accessing and managing the server’s hardware resources, it optimizes them in ways other hypervisors often cannot.” Advanced networking features in VergeFabric VergeFabric is the networking component within the VergeOS ecosystem, providing software-defined networking capabilities as an integrated service rather than as a separate virtual machine or application.

Read More »

Podcast: On the Frontier of Modular Edge AI Data Centers with Flexnode’s Andrew Lindsey

The modular data center industry is undergoing a seismic shift in the age of AI, and few are as deeply embedded in this transformation as Andrew Lindsey, Co-Founder and CEO of Flexnode. In a recent episode of the Data Center Frontier Show podcast, Lindsey joined Editor-in-Chief Matt Vincent and Senior Editor David Chernicoff to discuss the evolution of modular data centers, the growing demand for high-density liquid-cooled solutions, and the industry factors driving this momentum. A Background Rooted in Innovation Lindsey’s career has been defined by the intersection of technology and the built environment. Prior to launching Flexnode, he worked at Alpha Corporation, a top 100 engineering and construction management firm founded by his father in 1979. His early career involved spearheading technology adoption within the firm, with a focus on high-security infrastructure for both government and private clients. Recognizing a massive opportunity in the data center space, Lindsey saw a need for an innovative approach to infrastructure deployment. “The construction industry is relatively uninnovative,” he explained, citing a McKinsey study that ranked construction as the second least-digitized industry—just above fishing and wildlife, which remains deliberately undigitized. Given the billions of square feet of data center infrastructure required in a relatively short timeframe, Lindsey set out to streamline and modernize the process. Founded four years ago, Flexnode delivers modular data centers with a fully integrated approach, handling everything from site selection to design, engineering, manufacturing, deployment, operations, and even end-of-life decommissioning. Their core mission is to provide an “easy button” for high-density computing solutions, including cloud and dedicated GPU infrastructure, allowing faster and more efficient deployment of modular data centers. The Rising Momentum for Modular Data Centers As Vincent noted, Data Center Frontier has closely tracked the increasing traction of modular infrastructure. Lindsey has been at the forefront of this

Read More »

Last Energy to Deploy 30 Microreactors in Texas for Data Centers

As the demand for data center power surges in Texas, nuclear startup Last Energy has now announced plans to build 30 microreactors in the state’s Haskell County near the Dallas-Fort Worth Metroplex. The reactors will serve a growing customer base of data center operators in the region looking for reliable, carbon-free energy. The plan marks Last Energy’s largest project to date and a significant step in advancing modular nuclear power as a viable solution for high-density computing infrastructure. Meeting the Looming Power Demands of Texas Data Centers Texas is already home to over 340 data centers, with significant expansion underway. Google is increasing its data center footprint in Dallas, while OpenAI’s Stargate has announced plans for a new facility in Abilene, just an hour south of Last Energy’s planned site. The company notes the Dallas-Fort Worth metro area alone is projected to require an additional 43 gigawatts of power in the coming years, far surpassing current grid capacity. To help remediate, Last Energy has secured a 200+ acre site in Haskell County, approximately three and a half hours west of Dallas. The company has also filed for a grid connection with ERCOT, with plans to deliver power via a mix of private wire and grid transmission. Additionally, Last Energy has begun pre-application engagement with the U.S. Nuclear Regulatory Commission (NRC) for an Early Site Permit, a key step in securing regulatory approval. According to Last Energy CEO Bret Kugelmass, the company’s modular approach is designed to bring nuclear energy online faster than traditional projects. “Nuclear power is the most effective way to meet Texas’ growing energy demand, but it needs to be deployed faster and at scale,” Kugelmass said. “Our microreactors are designed to be plug-and-play, enabling data center operators to bypass the constraints of an overloaded grid.” Scaling Nuclear for

Read More »

Data Center Jobs: Engineering and Technician Jobs Available in Major Markets

Each month Data Center Frontier, in partnership with Pkaza, posts some of the hottest data center career opportunities in the market. Here’s a look at some of the latest data center jobs posted on the Data Center Frontier jobs board, powered by Pkaza Critical Facilities Recruiting.  Data Center Facility Engineer (Night Shift Available) Ashburn, VAThis position is also available in: Tacoma, WA (Nights), Days/Nights: Needham, MA and New York City, NY. This opportunity is working directly with a leading mission-critical data center developer / wholesaler / colo provider. This firm provides data center solutions custom-fit to the requirements of their client’s mission-critical operational facilities. They provide reliability of mission-critical facilities for many of the world’s largest organizations facilities supporting enterprise clients and hyperscale companies. This opportunity provides a career-growth minded role with exciting projects with leading-edge technology and innovation as well as competitive salaries and benefits. Electrical Commissioning Engineer New Albany, OHThis traveling position is also available in: Somerset, NJ; Boydton, VA; Richmond, VA; Ashburn, VA; Charlotte, NC; Atlanta, GA; Hampton, GA; Fayetteville, GA; Des Moines, IA; San Jose, CA; Portland, OR; St Louis, MO; Phoenix, AZ;  Dallas, TX;  Chicago, IL; or Toronto, ON. *** ALSO looking for a LEAD EE and ME CxA agents.*** Our client is an engineering design and commissioning company that has a national footprint and specializes in MEP critical facilities design. They provide design, commissioning, consulting and management expertise in the critical facilities space. They have a mindset to provide reliability, energy efficiency, sustainable design and LEED expertise when providing these consulting services for enterprise, colocation and hyperscale companies. This career-growth minded opportunity offers exciting projects with leading-edge technology and innovation as well as competitive salaries and benefits. Switchgear Field Service Technician – Critical Facilities Nationwide TravelThis position is also available in: Charlotte, NC; Atlanta, GA; Dallas,

Read More »

Amid Shifting Regional Data Center Policies, Iron Mountain and DC Blox Both Expand in Virginia’s Henrico County

The dynamic landscape of data center developments in Maryland and Virginia exemplify the intricate balance between fostering technological growth and addressing community and environmental concerns. Data center developers in this region find themselves both in the crosshairs of groups worried about the environment and other groups looking to drive economic growth. In some cases, the groups are different components of the same organizations, such as local governments. For data center development, meeting the needs of these competing interests often means walking a none-too-stable tightrope. Rapid Government Action Encourages Growth In May 2024, Maryland demonstrated its commitment to attracting data center investments by enacting the Critical Infrastructure Streamlining Act. This legislation provides a clear framework for the use of emergency backup power generation, addressing previous regulatory challenges that a few months earlier had hindered projects like Aligned Data Centers’ proposed 264-megawatt campus in Frederick County, causing Aligned to pull out of the project. However, just days after the Act was signed by the governor, Aligned reiterated its plans to move forward with development in Maryland.  With the Quantum Loop and the related data center development making Frederick County a focal point for a balanced approach, the industry is paying careful attention to the pace of development and the relations between developers, communities and the government. In September of 2024, Frederick County Executive Jessica Fitzwater revealed draft legislation that would potentially restrict where in the county data centers could be built. The legislation was based on information found in the Frederick County Data Centers Workgroup’s final report. Those bills would update existing regulations and create a floating zone for Critical Digital Infrastructure and place specific requirements on siting data centers. Statewide, a cautious approach to environmental and community impacts statewide has been deemed important. In January 2025, legislators introduced SB116,  a bill

Read More »

Microsoft will invest $80B in AI data centers in fiscal 2025

And Microsoft isn’t the only one that is ramping up its investments into AI-enabled data centers. Rival cloud service providers are all investing in either upgrading or opening new data centers to capture a larger chunk of business from developers and users of large language models (LLMs).  In a report published in October 2024, Bloomberg Intelligence estimated that demand for generative AI would push Microsoft, AWS, Google, Oracle, Meta, and Apple would between them devote $200 billion to capex in 2025, up from $110 billion in 2023. Microsoft is one of the biggest spenders, followed closely by Google and AWS, Bloomberg Intelligence said. Its estimate of Microsoft’s capital spending on AI, at $62.4 billion for calendar 2025, is lower than Smith’s claim that the company will invest $80 billion in the fiscal year to June 30, 2025. Both figures, though, are way higher than Microsoft’s 2020 capital expenditure of “just” $17.6 billion. The majority of the increased spending is tied to cloud services and the expansion of AI infrastructure needed to provide compute capacity for OpenAI workloads. Separately, last October Amazon CEO Andy Jassy said his company planned total capex spend of $75 billion in 2024 and even more in 2025, with much of it going to AWS, its cloud computing division.

Read More »

John Deere unveils more autonomous farm machines to address skill labor shortage

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More Self-driving tractors might be the path to self-driving cars. John Deere has revealed a new line of autonomous machines and tech across agriculture, construction and commercial landscaping. The Moline, Illinois-based John Deere has been in business for 187 years, yet it’s been a regular as a non-tech company showing off technology at the big tech trade show in Las Vegas and is back at CES 2025 with more autonomous tractors and other vehicles. This is not something we usually cover, but John Deere has a lot of data that is interesting in the big picture of tech. The message from the company is that there aren’t enough skilled farm laborers to do the work that its customers need. It’s been a challenge for most of the last two decades, said Jahmy Hindman, CTO at John Deere, in a briefing. Much of the tech will come this fall and after that. He noted that the average farmer in the U.S. is over 58 and works 12 to 18 hours a day to grow food for us. And he said the American Farm Bureau Federation estimates there are roughly 2.4 million farm jobs that need to be filled annually; and the agricultural work force continues to shrink. (This is my hint to the anti-immigration crowd). John Deere’s autonomous 9RX Tractor. Farmers can oversee it using an app. While each of these industries experiences their own set of challenges, a commonality across all is skilled labor availability. In construction, about 80% percent of contractors struggle to find skilled labor. And in commercial landscaping, 86% of landscaping business owners can’t find labor to fill open positions, he said. “They have to figure out how to do

Read More »

2025 playbook for enterprise AI success, from agents to evals

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More 2025 is poised to be a pivotal year for enterprise AI. The past year has seen rapid innovation, and this year will see the same. This has made it more critical than ever to revisit your AI strategy to stay competitive and create value for your customers. From scaling AI agents to optimizing costs, here are the five critical areas enterprises should prioritize for their AI strategy this year. 1. Agents: the next generation of automation AI agents are no longer theoretical. In 2025, they’re indispensable tools for enterprises looking to streamline operations and enhance customer interactions. Unlike traditional software, agents powered by large language models (LLMs) can make nuanced decisions, navigate complex multi-step tasks, and integrate seamlessly with tools and APIs. At the start of 2024, agents were not ready for prime time, making frustrating mistakes like hallucinating URLs. They started getting better as frontier large language models themselves improved. “Let me put it this way,” said Sam Witteveen, cofounder of Red Dragon, a company that develops agents for companies, and that recently reviewed the 48 agents it built last year. “Interestingly, the ones that we built at the start of the year, a lot of those worked way better at the end of the year just because the models got better.” Witteveen shared this in the video podcast we filmed to discuss these five big trends in detail. Models are getting better and hallucinating less, and they’re also being trained to do agentic tasks. Another feature that the model providers are researching is a way to use the LLM as a judge, and as models get cheaper (something we’ll cover below), companies can use three or more models to

Read More »

OpenAI’s red teaming innovations define new essentials for security leaders in the AI era

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More OpenAI has taken a more aggressive approach to red teaming than its AI competitors, demonstrating its security teams’ advanced capabilities in two areas: multi-step reinforcement and external red teaming. OpenAI recently released two papers that set a new competitive standard for improving the quality, reliability and safety of AI models in these two techniques and more. The first paper, “OpenAI’s Approach to External Red Teaming for AI Models and Systems,” reports that specialized teams outside the company have proven effective in uncovering vulnerabilities that might otherwise have made it into a released model because in-house testing techniques may have missed them. In the second paper, “Diverse and Effective Red Teaming with Auto-Generated Rewards and Multi-Step Reinforcement Learning,” OpenAI introduces an automated framework that relies on iterative reinforcement learning to generate a broad spectrum of novel, wide-ranging attacks. Going all-in on red teaming pays practical, competitive dividends It’s encouraging to see competitive intensity in red teaming growing among AI companies. When Anthropic released its AI red team guidelines in June of last year, it joined AI providers including Google, Microsoft, Nvidia, OpenAI, and even the U.S.’s National Institute of Standards and Technology (NIST), which all had released red teaming frameworks. Investing heavily in red teaming yields tangible benefits for security leaders in any organization. OpenAI’s paper on external red teaming provides a detailed analysis of how the company strives to create specialized external teams that include cybersecurity and subject matter experts. The goal is to see if knowledgeable external teams can defeat models’ security perimeters and find gaps in their security, biases and controls that prompt-based testing couldn’t find. What makes OpenAI’s recent papers noteworthy is how well they define using human-in-the-middle

Read More »