How to stop wasting time designing architechture
I have recently graduated from uni and started working as a programmer. I don't find it that hard to solve "technical" issues or do debugging, things that I would say have 1 solution. But there seems to be a class of problems that don't have one solution -- things like software architecture. These things befuddle me and cause me great distress.
I spend hours and hours trying to decide how to "architect" my programs and systems. For example, do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time, and it greatly frustrates me. I just want to create the program, the architecture be dammed.
How can I more quickly get through the architecture phase and onto the coding and debugging phase, which I enjoy?
design
New contributor
add a comment |
I have recently graduated from uni and started working as a programmer. I don't find it that hard to solve "technical" issues or do debugging, things that I would say have 1 solution. But there seems to be a class of problems that don't have one solution -- things like software architecture. These things befuddle me and cause me great distress.
I spend hours and hours trying to decide how to "architect" my programs and systems. For example, do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time, and it greatly frustrates me. I just want to create the program, the architecture be dammed.
How can I more quickly get through the architecture phase and onto the coding and debugging phase, which I enjoy?
design
New contributor
3
By doing a lot more of it. You'll figure out what does and doesn't work. Notice that asking the question here is following the same trend of discussion without the context of actual code: time that could be spent learning by doing. Debating this stuff is fun, and certain patterns are objectively better than other ones, but it's really really hard to have a meaningful opinion without experience (read: scars).
– Jared Smith
4 hours ago
1
Architecting is your planning phase - get it right and it's 90% of your effort, with the rest being the coding, debugging and user acceptance. Skipping it or rushing it is not recommended, as you can end up with unmaintainable, unextendable solutions, so if you don't like doing it then you probably need someone else doing it for you... Naming is one of the hardest issues in software development, a developer can agonise for days over the name of a 5 line method. Make everything private until it needs to be something else. Split classes up when they do more than one thing.
– Moo
34 mins ago
add a comment |
I have recently graduated from uni and started working as a programmer. I don't find it that hard to solve "technical" issues or do debugging, things that I would say have 1 solution. But there seems to be a class of problems that don't have one solution -- things like software architecture. These things befuddle me and cause me great distress.
I spend hours and hours trying to decide how to "architect" my programs and systems. For example, do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time, and it greatly frustrates me. I just want to create the program, the architecture be dammed.
How can I more quickly get through the architecture phase and onto the coding and debugging phase, which I enjoy?
design
New contributor
I have recently graduated from uni and started working as a programmer. I don't find it that hard to solve "technical" issues or do debugging, things that I would say have 1 solution. But there seems to be a class of problems that don't have one solution -- things like software architecture. These things befuddle me and cause me great distress.
I spend hours and hours trying to decide how to "architect" my programs and systems. For example, do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time, and it greatly frustrates me. I just want to create the program, the architecture be dammed.
How can I more quickly get through the architecture phase and onto the coding and debugging phase, which I enjoy?
design
design
New contributor
New contributor
New contributor
asked 6 hours ago
JRG
161
161
New contributor
New contributor
3
By doing a lot more of it. You'll figure out what does and doesn't work. Notice that asking the question here is following the same trend of discussion without the context of actual code: time that could be spent learning by doing. Debating this stuff is fun, and certain patterns are objectively better than other ones, but it's really really hard to have a meaningful opinion without experience (read: scars).
– Jared Smith
4 hours ago
1
Architecting is your planning phase - get it right and it's 90% of your effort, with the rest being the coding, debugging and user acceptance. Skipping it or rushing it is not recommended, as you can end up with unmaintainable, unextendable solutions, so if you don't like doing it then you probably need someone else doing it for you... Naming is one of the hardest issues in software development, a developer can agonise for days over the name of a 5 line method. Make everything private until it needs to be something else. Split classes up when they do more than one thing.
– Moo
34 mins ago
add a comment |
3
By doing a lot more of it. You'll figure out what does and doesn't work. Notice that asking the question here is following the same trend of discussion without the context of actual code: time that could be spent learning by doing. Debating this stuff is fun, and certain patterns are objectively better than other ones, but it's really really hard to have a meaningful opinion without experience (read: scars).
– Jared Smith
4 hours ago
1
Architecting is your planning phase - get it right and it's 90% of your effort, with the rest being the coding, debugging and user acceptance. Skipping it or rushing it is not recommended, as you can end up with unmaintainable, unextendable solutions, so if you don't like doing it then you probably need someone else doing it for you... Naming is one of the hardest issues in software development, a developer can agonise for days over the name of a 5 line method. Make everything private until it needs to be something else. Split classes up when they do more than one thing.
– Moo
34 mins ago
3
3
By doing a lot more of it. You'll figure out what does and doesn't work. Notice that asking the question here is following the same trend of discussion without the context of actual code: time that could be spent learning by doing. Debating this stuff is fun, and certain patterns are objectively better than other ones, but it's really really hard to have a meaningful opinion without experience (read: scars).
– Jared Smith
4 hours ago
By doing a lot more of it. You'll figure out what does and doesn't work. Notice that asking the question here is following the same trend of discussion without the context of actual code: time that could be spent learning by doing. Debating this stuff is fun, and certain patterns are objectively better than other ones, but it's really really hard to have a meaningful opinion without experience (read: scars).
– Jared Smith
4 hours ago
1
1
Architecting is your planning phase - get it right and it's 90% of your effort, with the rest being the coding, debugging and user acceptance. Skipping it or rushing it is not recommended, as you can end up with unmaintainable, unextendable solutions, so if you don't like doing it then you probably need someone else doing it for you... Naming is one of the hardest issues in software development, a developer can agonise for days over the name of a 5 line method. Make everything private until it needs to be something else. Split classes up when they do more than one thing.
– Moo
34 mins ago
Architecting is your planning phase - get it right and it's 90% of your effort, with the rest being the coding, debugging and user acceptance. Skipping it or rushing it is not recommended, as you can end up with unmaintainable, unextendable solutions, so if you don't like doing it then you probably need someone else doing it for you... Naming is one of the hardest issues in software development, a developer can agonise for days over the name of a 5 line method. Make everything private until it needs to be something else. Split classes up when they do more than one thing.
– Moo
34 mins ago
add a comment |
3 Answers
3
active
oldest
votes
Perfect is the enemy of good.
That said, you should not cut corners. Software design will have longer lasting impact, and save you (and your peers) tons of time and effort in the future. It will take longer to get right. Most of the time spent programming isn't hammering on a keyboard, but by a whiteboard figuring out how to solve a problem.
But you also shouldn't worry about perfection. If two designs fight to a stalemate, it means they're likely about the same goodness. Just go with one. It's not as though you can't change things once you figure out the flaws in that design.
(And hopefully it will also help out once you find out that there's not just one way to debug/solve technical issues.)
1
Paralysis by Analysis also comes to mind.
– mike65535
6 hours ago
Sometimes the perfect final arbiter for a design decision is a quarter.
– candied_orange
54 mins ago
add a comment |
What you can do is start with the minimal number of abstractions that you need. For example, a Person class in one file. Now as you keep on adding code and features, you start seeing things that need to be moved to a different abstraction. For example the single responsibility principle(S of SOLID) tells you to not have methods related to address parsing in the Person class. So you now know that you need an Address class.
But it is always good to take some time to think about what "minimal number of abstractions" looks like for your system. Start from a good enough architecture and improve it as you go.
add a comment |
For simple and small programs (e.g. with less than ten thousands lines of source code), you can architecture them while writing the code. You should adopt an iterative and incremental development approach and you'll make progressively architectural decisions while writing your code: so write a few dozen lines of code (adding some single micro feature), improve them to get no warnings from your compiler, test that in your debugger, and repeat.
do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time
They should not. And they don't matter that much for a small program. You just need to be consistent. And you really need, from time to time, to refactor slightly some small parts of your program (and that is not a big deal).
Look into most free software programs (even big ones like the Linux kernel). They have not being "architectured" during a long time at the beginning. UML is almost never used in free software. And you'll learn a big lot by studying the source code of several free software projects.
As a newbie, either you are working in a large software project, and then you need to trust the senior developer (who makes architectural decisions), or you work on small projects (typically, less than a few dozen thousands of source code). In the later case, you'll make incremental architectural decisions, refactor your application from time to time, so the "architectural design" will come naturally.
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "131"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
JRG is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsoftwareengineering.stackexchange.com%2fquestions%2f384861%2fhow-to-stop-wasting-time-designing-architechture%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Perfect is the enemy of good.
That said, you should not cut corners. Software design will have longer lasting impact, and save you (and your peers) tons of time and effort in the future. It will take longer to get right. Most of the time spent programming isn't hammering on a keyboard, but by a whiteboard figuring out how to solve a problem.
But you also shouldn't worry about perfection. If two designs fight to a stalemate, it means they're likely about the same goodness. Just go with one. It's not as though you can't change things once you figure out the flaws in that design.
(And hopefully it will also help out once you find out that there's not just one way to debug/solve technical issues.)
1
Paralysis by Analysis also comes to mind.
– mike65535
6 hours ago
Sometimes the perfect final arbiter for a design decision is a quarter.
– candied_orange
54 mins ago
add a comment |
Perfect is the enemy of good.
That said, you should not cut corners. Software design will have longer lasting impact, and save you (and your peers) tons of time and effort in the future. It will take longer to get right. Most of the time spent programming isn't hammering on a keyboard, but by a whiteboard figuring out how to solve a problem.
But you also shouldn't worry about perfection. If two designs fight to a stalemate, it means they're likely about the same goodness. Just go with one. It's not as though you can't change things once you figure out the flaws in that design.
(And hopefully it will also help out once you find out that there's not just one way to debug/solve technical issues.)
1
Paralysis by Analysis also comes to mind.
– mike65535
6 hours ago
Sometimes the perfect final arbiter for a design decision is a quarter.
– candied_orange
54 mins ago
add a comment |
Perfect is the enemy of good.
That said, you should not cut corners. Software design will have longer lasting impact, and save you (and your peers) tons of time and effort in the future. It will take longer to get right. Most of the time spent programming isn't hammering on a keyboard, but by a whiteboard figuring out how to solve a problem.
But you also shouldn't worry about perfection. If two designs fight to a stalemate, it means they're likely about the same goodness. Just go with one. It's not as though you can't change things once you figure out the flaws in that design.
(And hopefully it will also help out once you find out that there's not just one way to debug/solve technical issues.)
Perfect is the enemy of good.
That said, you should not cut corners. Software design will have longer lasting impact, and save you (and your peers) tons of time and effort in the future. It will take longer to get right. Most of the time spent programming isn't hammering on a keyboard, but by a whiteboard figuring out how to solve a problem.
But you also shouldn't worry about perfection. If two designs fight to a stalemate, it means they're likely about the same goodness. Just go with one. It's not as though you can't change things once you figure out the flaws in that design.
(And hopefully it will also help out once you find out that there's not just one way to debug/solve technical issues.)
edited 6 hours ago
answered 6 hours ago
Telastyn
92.2k24208317
92.2k24208317
1
Paralysis by Analysis also comes to mind.
– mike65535
6 hours ago
Sometimes the perfect final arbiter for a design decision is a quarter.
– candied_orange
54 mins ago
add a comment |
1
Paralysis by Analysis also comes to mind.
– mike65535
6 hours ago
Sometimes the perfect final arbiter for a design decision is a quarter.
– candied_orange
54 mins ago
1
1
Paralysis by Analysis also comes to mind.
– mike65535
6 hours ago
Paralysis by Analysis also comes to mind.
– mike65535
6 hours ago
Sometimes the perfect final arbiter for a design decision is a quarter.
– candied_orange
54 mins ago
Sometimes the perfect final arbiter for a design decision is a quarter.
– candied_orange
54 mins ago
add a comment |
What you can do is start with the minimal number of abstractions that you need. For example, a Person class in one file. Now as you keep on adding code and features, you start seeing things that need to be moved to a different abstraction. For example the single responsibility principle(S of SOLID) tells you to not have methods related to address parsing in the Person class. So you now know that you need an Address class.
But it is always good to take some time to think about what "minimal number of abstractions" looks like for your system. Start from a good enough architecture and improve it as you go.
add a comment |
What you can do is start with the minimal number of abstractions that you need. For example, a Person class in one file. Now as you keep on adding code and features, you start seeing things that need to be moved to a different abstraction. For example the single responsibility principle(S of SOLID) tells you to not have methods related to address parsing in the Person class. So you now know that you need an Address class.
But it is always good to take some time to think about what "minimal number of abstractions" looks like for your system. Start from a good enough architecture and improve it as you go.
add a comment |
What you can do is start with the minimal number of abstractions that you need. For example, a Person class in one file. Now as you keep on adding code and features, you start seeing things that need to be moved to a different abstraction. For example the single responsibility principle(S of SOLID) tells you to not have methods related to address parsing in the Person class. So you now know that you need an Address class.
But it is always good to take some time to think about what "minimal number of abstractions" looks like for your system. Start from a good enough architecture and improve it as you go.
What you can do is start with the minimal number of abstractions that you need. For example, a Person class in one file. Now as you keep on adding code and features, you start seeing things that need to be moved to a different abstraction. For example the single responsibility principle(S of SOLID) tells you to not have methods related to address parsing in the Person class. So you now know that you need an Address class.
But it is always good to take some time to think about what "minimal number of abstractions" looks like for your system. Start from a good enough architecture and improve it as you go.
answered 5 hours ago
sul4bh
394136
394136
add a comment |
add a comment |
For simple and small programs (e.g. with less than ten thousands lines of source code), you can architecture them while writing the code. You should adopt an iterative and incremental development approach and you'll make progressively architectural decisions while writing your code: so write a few dozen lines of code (adding some single micro feature), improve them to get no warnings from your compiler, test that in your debugger, and repeat.
do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time
They should not. And they don't matter that much for a small program. You just need to be consistent. And you really need, from time to time, to refactor slightly some small parts of your program (and that is not a big deal).
Look into most free software programs (even big ones like the Linux kernel). They have not being "architectured" during a long time at the beginning. UML is almost never used in free software. And you'll learn a big lot by studying the source code of several free software projects.
As a newbie, either you are working in a large software project, and then you need to trust the senior developer (who makes architectural decisions), or you work on small projects (typically, less than a few dozen thousands of source code). In the later case, you'll make incremental architectural decisions, refactor your application from time to time, so the "architectural design" will come naturally.
add a comment |
For simple and small programs (e.g. with less than ten thousands lines of source code), you can architecture them while writing the code. You should adopt an iterative and incremental development approach and you'll make progressively architectural decisions while writing your code: so write a few dozen lines of code (adding some single micro feature), improve them to get no warnings from your compiler, test that in your debugger, and repeat.
do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time
They should not. And they don't matter that much for a small program. You just need to be consistent. And you really need, from time to time, to refactor slightly some small parts of your program (and that is not a big deal).
Look into most free software programs (even big ones like the Linux kernel). They have not being "architectured" during a long time at the beginning. UML is almost never used in free software. And you'll learn a big lot by studying the source code of several free software projects.
As a newbie, either you are working in a large software project, and then you need to trust the senior developer (who makes architectural decisions), or you work on small projects (typically, less than a few dozen thousands of source code). In the later case, you'll make incremental architectural decisions, refactor your application from time to time, so the "architectural design" will come naturally.
add a comment |
For simple and small programs (e.g. with less than ten thousands lines of source code), you can architecture them while writing the code. You should adopt an iterative and incremental development approach and you'll make progressively architectural decisions while writing your code: so write a few dozen lines of code (adding some single micro feature), improve them to get no warnings from your compiler, test that in your debugger, and repeat.
do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time
They should not. And they don't matter that much for a small program. You just need to be consistent. And you really need, from time to time, to refactor slightly some small parts of your program (and that is not a big deal).
Look into most free software programs (even big ones like the Linux kernel). They have not being "architectured" during a long time at the beginning. UML is almost never used in free software. And you'll learn a big lot by studying the source code of several free software projects.
As a newbie, either you are working in a large software project, and then you need to trust the senior developer (who makes architectural decisions), or you work on small projects (typically, less than a few dozen thousands of source code). In the later case, you'll make incremental architectural decisions, refactor your application from time to time, so the "architectural design" will come naturally.
For simple and small programs (e.g. with less than ten thousands lines of source code), you can architecture them while writing the code. You should adopt an iterative and incremental development approach and you'll make progressively architectural decisions while writing your code: so write a few dozen lines of code (adding some single micro feature), improve them to get no warnings from your compiler, test that in your debugger, and repeat.
do I split this logic up into 1 or 2 classes, how do I name the classes, should I make this private or public, etc. These kinds of questions take up so much of my time
They should not. And they don't matter that much for a small program. You just need to be consistent. And you really need, from time to time, to refactor slightly some small parts of your program (and that is not a big deal).
Look into most free software programs (even big ones like the Linux kernel). They have not being "architectured" during a long time at the beginning. UML is almost never used in free software. And you'll learn a big lot by studying the source code of several free software projects.
As a newbie, either you are working in a large software project, and then you need to trust the senior developer (who makes architectural decisions), or you work on small projects (typically, less than a few dozen thousands of source code). In the later case, you'll make incremental architectural decisions, refactor your application from time to time, so the "architectural design" will come naturally.
edited 7 mins ago
answered 12 mins ago
Basile Starynkevitch
27.2k56098
27.2k56098
add a comment |
add a comment |
JRG is a new contributor. Be nice, and check out our Code of Conduct.
JRG is a new contributor. Be nice, and check out our Code of Conduct.
JRG is a new contributor. Be nice, and check out our Code of Conduct.
JRG is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Software Engineering Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsoftwareengineering.stackexchange.com%2fquestions%2f384861%2fhow-to-stop-wasting-time-designing-architechture%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
3
By doing a lot more of it. You'll figure out what does and doesn't work. Notice that asking the question here is following the same trend of discussion without the context of actual code: time that could be spent learning by doing. Debating this stuff is fun, and certain patterns are objectively better than other ones, but it's really really hard to have a meaningful opinion without experience (read: scars).
– Jared Smith
4 hours ago
1
Architecting is your planning phase - get it right and it's 90% of your effort, with the rest being the coding, debugging and user acceptance. Skipping it or rushing it is not recommended, as you can end up with unmaintainable, unextendable solutions, so if you don't like doing it then you probably need someone else doing it for you... Naming is one of the hardest issues in software development, a developer can agonise for days over the name of a 5 line method. Make everything private until it needs to be something else. Split classes up when they do more than one thing.
– Moo
34 mins ago