Building The Agile Database


Published on

Published in: Technology, Business
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Building The Agile Database

  1. 1. Building the Agile Database Larry Burns Consultant PACCAR Data Services
  2. 2. What does “agility” mean? <ul><li>The ability to respond quickly and effectively to changes in business requirements and new technology. </li></ul><ul><li>The agile approach is characterized by an emphasis on personal interaction and collaboration, determining people’s needs, and working quickly to meet those needs. </li></ul>
  3. 3. How does AD work? <ul><li>The goal of Agile Development (AD) is to quickly produce solutions that are “good enough” (meeting 80% of the requirements). </li></ul><ul><li>Software development occurs continuously and iteratively, with new releases taking place every 2-6 weeks. </li></ul><ul><li>Continuous testing is built into the development process. </li></ul>
  4. 5. Essential concepts of AD <ul><li>Agile Development emphasizes: </li></ul><ul><ul><li>Individuals and interactions over processes and tools (collaboration and teamwork). </li></ul></ul><ul><ul><li>Working software over comprehensive documentation (“just enough” process and documentation to get the job done). </li></ul></ul><ul><ul><li>Customer collaboration over contract negotiation </li></ul></ul><ul><ul><li>Flexible response to change over fixed plans. </li></ul></ul>
  5. 6. Benefits of AD <ul><li>Allows you to speed up “time to market”, and take advantage of narrower “windows of opportunity”. </li></ul><ul><li>Allows requirements to be adjusted as the product is developed </li></ul><ul><li>Eliminates the waste of developing features that aren’t needed </li></ul>
  6. 7. Benefits of AD <ul><li>Reduces the risk of project failure </li></ul><ul><li>Problems and risks can be surfaced early </li></ul><ul><li>Testing is integrated into the development process </li></ul><ul><li>Final product is more in-line with current user requirements </li></ul><ul><li>Reduces the risk of outsourcing </li></ul>
  7. 8. What does “agility” imply? <ul><li>The ability to reuse application components (and data) is essential to AD. </li></ul><ul><li>The ability to design and build loosely-coupled systems is essential to AD. </li></ul><ul><li>The ability to automate routine tasks is essential to AD. </li></ul>
  8. 9. What does “agility” imply? <ul><li>The ability to create policy-based (rule-based) components is essential to AD. </li></ul><ul><li>The ability to enhance processes based on experience is essential to AD. </li></ul><ul><li>The ability to recognize that problems and exceptions will occur, and to empower people to handle them is essential to AD. </li></ul>
  9. 10. What does “agility” imply? <ul><li>The ability to generalize (i.e., understand areas outside your particular domain) as well as specialize (within your domain) is essential to AD. </li></ul><ul><li>A customer service mindset and positive (“can do”) attitude are essential to AD. </li></ul>
  10. 11. Critical Issues for AD <ul><li>Reusability . Coding for reuse takes 50-100% longer, and most developers don’t do this. But DBAs have to – it’s our job! </li></ul><ul><li>Quality . Application errors are easier to detect and fix (or work around) than data errors. Quality directly affects reusability. It also affects ROI (“time to money”)! </li></ul><ul><li>Waste . AD methods can generate large amounts of “scrap and rework”. </li></ul>
  11. 12. Critical Issues for AD <ul><li>Resources . AD works best when resources are 100% dedicated to a single project, but DBAs have to support multiple projects. Also, AD is more resource-intensive than other methodologies. </li></ul><ul><li>Focus . Development focus is on a single application; DBA focus is on designing and building an infrastructure that meets current and future data needs. </li></ul>
  12. 13. Critical Issues for AD <ul><li>Maintainability . Somebody has to maintain the application after it’s written; maintenance expense far exceeds development expense. </li></ul><ul><li>Personnel . AD projects involve long hours, frequent requirements changes, intensive collaboration and lots of stress. This may be a difficult adjustment for data professionals not used to this sort of work environment. </li></ul>
  13. 14. Principles of data management <ul><li>Reusability – Ability to reuse data for multiple applications and multiple business purposes (e.g., quality improvement, business process improvement, customer relationship management, strategic planning, etc.). </li></ul><ul><ul><li>Important: Organizations have data needs outside of the data requirements of particular applications! </li></ul></ul>
  14. 15. Principles of data management <ul><li>Integrity – ensuring that data always has a valid business meaning and value, and always reflects a valid state of the business. Data should also be, as much as possible, self-monitoring and self-correcting. </li></ul>
  15. 16. Principles of data management <ul><li>Security – Ensure true and accurate data is always available to authorized persons, but only to authorized persons. We also want to make sure that the privacy concerns of all our stakeholders – including our customers, partners, and government regulators – are met. </li></ul>
  16. 17. Principles of data management <ul><li>Performance and Ease of Use : ensuring quick and easy access to data by approved users in a usable and business-relevant form, maximizing the business value of both our applications and our data, and improving our relationships with our customers and business users. </li></ul>
  17. 18. Principles of data management <ul><li>Low Cost of Maintenance : ensure that all data work is done at a cost that yields value ; that the cost of creating, using, and disposing of data doesn’t exceed its value to the business. We also want to ensure the fastest possible response to changes in business processes and new business requirements . </li></ul>
  18. 19. Principles of data management <ul><li>P erformance and Ease of Use </li></ul><ul><li>R eusability </li></ul><ul><li>I ntegrity </li></ul><ul><li>S ecurity </li></ul><ul><li>M aintainability </li></ul>
  19. 20. Agile Data Management <ul><li>Design and build highly-cohesive, loosely coupled (i.e., normalized ) data structures </li></ul><ul><li>Make data available in application-friendly, non-normalized forms (e.g., views ) </li></ul><ul><li>Abstract and encapsulate database functionality – eliminate coupling </li></ul><ul><li>Refactor at a virtual level, not at the database schema level </li></ul>
  20. 21. Agile Data Management <ul><li>Learn to manage non-relational data </li></ul><ul><li>Make the database do the data work (the n-tier approach) </li></ul><ul><li>Automate as much of the database development process as possible </li></ul><ul><li>Learn to collaborate </li></ul><ul><li>Learn to work iteratively (within reason!) </li></ul><ul><li>Develop a customer service mindset </li></ul>
  21. 22. Abstraction and Encapsulation <ul><li>Abstraction </li></ul><ul><ul><li>Identifying the “what” </li></ul></ul><ul><li>Encapsulation </li></ul><ul><ul><li>Packaging the “how” </li></ul></ul><ul><li>Present an easy-to-use interface that enables the “what” and hides the “how” </li></ul><ul><li>Exs: light switch, car dashboard </li></ul>
  22. 23. Database Abstraction <ul><ul><li>Fundamental Stored Procedures (FSPs) </li></ul></ul><ul><ul><li>Data Access Components / Layers </li></ul></ul><ul><ul><li>Data Integration Web Services </li></ul></ul><ul><ul><li>Views </li></ul></ul><ul><ul><li>Work Tables </li></ul></ul>
  23. 24. Database Abstraction <ul><ul><li>ADO.NET Datasets </li></ul></ul><ul><ul><li>Stored Procedures </li></ul></ul><ul><ul><li>Triggers </li></ul></ul><ul><ul><li>User-defined datatypes (UDTs) </li></ul></ul><ul><ul><li>User-defined functions (UFTs) </li></ul></ul>
  24. 25. Database Issues <ul><li>Performance </li></ul><ul><li>Maintainability </li></ul><ul><li>Portability </li></ul><ul><li>Refactoring </li></ul>
  25. 26. Database Issues <ul><li>Performance </li></ul><ul><ul><li>Limit the scope of views </li></ul></ul><ul><ul><li>Wrap views in parameterized procedures or functions </li></ul></ul><ul><ul><li>Use work tables in the database for denormalization (read-only) </li></ul></ul><ul><ul><li>Use replication as necessary </li></ul></ul><ul><ul><li>Create reporting databases or data marts </li></ul></ul>
  26. 27. Database Issues <ul><li>Maintainability </li></ul><ul><ul><li>Views and wrapper procedures/functions don’t require much (if any) maintenance </li></ul></ul><ul><ul><li>New code can be written as needed </li></ul></ul><ul><ul><li>Good idea to document all code, including the application it was written for, and all known applications that use it </li></ul></ul><ul><ul><li>Make sure all procedure code is testable </li></ul></ul>
  27. 28. Database Issues <ul><li>Portability </li></ul><ul><ul><li>Usually not an issue (except for commercial software packages) </li></ul></ul><ul><ul><li>The database code has to go somewhere! </li></ul></ul><ul><ul><li>Database code performs better in the DBMS </li></ul></ul><ul><ul><li>Migration is usually not that difficult (and lots of help is available from vendors and user groups!) </li></ul></ul><ul><ul><li>Cost of migrating is far exceeded by the economic benefit of data reuse and data quality </li></ul></ul>
  28. 29. Database Issues <ul><li>Refactoring </li></ul><ul><ul><li>Much easier (and less costly) to refactor at the virtual level, not the base schema level. </li></ul></ul><ul><ul><li>Denormalizing too early can mask key data and lead to data corruption, making future refactoring impossible! </li></ul></ul><ul><ul><li>Denormalizing can complicate queries and lead to performance problems! </li></ul></ul>
  29. 30. Tasks Tasks null smallint OverTimeHours null smallint ActHours7 null smallint EstHours7 null smallint etc, etc, etc… null smallint ActHours2 null smallint EstHours2 null smallint ActHours1 null smallint EstHours1 null tinyint WeekNo null varchar EmployeeName null int EmployeeNo null varchar ProjectMgr null int ProjectNo null varchar TaskDesc null varchar TaskTitle not null IDENTITY TaskID
  30. 31. Event varchar EventDesc datetime EventDateTime … etc. etc. etc. int EventType3Key int EventType2Key int EventType1Key smallint EventTypeCode IDENTITY EventID
  31. 32. The parameter list for your access procedure will have to look like this: CREATE PROCEDURE csEventProcedure (@EventTypeCode smallint, @EventType1Key int = null, @EventType2Key int = null, @EventType3Key int = null…) And the WHERE clause for the SELECT will have to look something like this: WHERE (@EventType1Key IS NOT NULL AND @EventType1Key = Event.EventType1Key)        OR (@EventType2Key IS NOT NULL AND @EventType2Key = Event.EventType2Key)        OR (@EventType3Key IS NOT NULL AND @EventType3Key = Event.EventType3Key)         … Or perhaps like this: WHERE (@EventTypeCode = 1 AND @EventType1Key = Event.EventType1Key)        OR (@EventTypeCode = 2 AND @EventType2Key = Event.EventType2Key)        OR (@EventTypeCode = 3 AND @EventType3Key = Event.EventType3Key)
  32. 33. Non-Database Issues <ul><li>Preferred approach (Engineer vs. Artist) </li></ul><ul><li>Perspective (Enterprise vs. Application) </li></ul><ul><ul><li>It’s about the business! </li></ul></ul><ul><li>Architectural Myopia </li></ul><ul><ul><li>Process-only view </li></ul></ul><ul><ul><li>Data-only view </li></ul></ul><ul><ul><li>Information Systems view </li></ul></ul>
  33. 34. Resolving the Conflicts <ul><li>Have a system of checks and balances in place: </li></ul><ul><ul><li>Architecture group </li></ul></ul><ul><ul><li>Project Management group </li></ul></ul><ul><ul><li>Quality group </li></ul></ul><ul><ul><li>Data group </li></ul></ul><ul><ul><li>Application groups (dev. & maint.) </li></ul></ul><ul><ul><li>Business and IT management </li></ul></ul>
  34. 35. Resolving the Conflicts <ul><li>Commit to finding a workable solution: </li></ul><ul><ul><li>Understand each group’s concerns </li></ul></ul><ul><ul><li>Accept the inevitable “trial and error” </li></ul></ul><ul><ul><li>Maintain an “agile attitude” </li></ul></ul><ul><ul><li>Focus on maintaining positive working relationships </li></ul></ul>
  35. 36. Resolving the Conflicts <ul><li>Negotiate compromises: </li></ul><ul><ul><li>Data group involvement in req’s gathering and analysis </li></ul></ul><ul><ul><li>Physical database design review (to promote opportunities for data virtualization) </li></ul></ul><ul><ul><li>Data group commits to supporting an iterative approach </li></ul></ul>
  36. 37. Bonus Slides <ul><li>Approaches for data virtualization </li></ul><ul><li>Examples </li></ul><ul><li>Developing an “Agile Attitude” </li></ul>
  37. 38. Fundamental Stored Procedures <ul><ul><li>Handle transaction control </li></ul></ul><ul><ul><li>Perform error handling </li></ul></ul><ul><ul><li>Enforce security </li></ul></ul><ul><ul><li>Maintain supertype/subtype relationships </li></ul></ul>
  38. 39. Fundamental Stored Procedures <ul><ul><li>Handle concurrency control via timestamp checking </li></ul></ul><ul><ul><li>Provide multi-language text support </li></ul></ul><ul><ul><li>Automatically generated from DB schema </li></ul></ul>
  39. 40. Fundamental Stored Procedures <ul><li>FSP Example – Table Definition </li></ul><ul><li>Examples of FSPs </li></ul>
  40. 41. Data Access Component <ul><ul><li>Automatically handles dataset and datatable updates using FSPs </li></ul></ul><ul><ul><li>Creates, populates and executes ADO.NET objects for queries, procedures, typed datasets, connections, transactions, etc. </li></ul></ul>
  41. 42. Data Access Component <ul><ul><li>Maintains database timestamps and uses them for updates </li></ul></ul><ul><ul><li>Uses a few simple overloaded functions (CreateConnection, GetData, UpdateData, etc.) </li></ul></ul><ul><ul><li>Supports parameterized SQL queries </li></ul></ul><ul><ul><li>Works with any RDBMS </li></ul></ul>
  42. 43. Data Access Component <ul><li>DAC Methods </li></ul>
  43. 44. Data Integration Web Services <ul><ul><li>Abstracts data combined from multiple sources </li></ul></ul><ul><ul><li>Decouples applications from data sources </li></ul></ul><ul><ul><li>Makes data more easily transportable and consumable </li></ul></ul>
  44. 45. Data Synchronization Integration Diagram (includes event queue tables) Mainframe Databases CICS Reformat as XML Application Server CICS Trans Web Service 1 Web Method A Web Method C Web Method D Web Method B Web Method E Web Method F Web Method G Web Method H Web Method I SQL Database Integration Server CICS Listener TCP to MSMQ MSMQ Message Broker Web Service 2 Web Method J Metadata CICS Trans CICS Client
  45. 46. Joined Views <ul><ul><li>Create an application-specific view of data, enabling a database to support multiple applications </li></ul></ul><ul><ul><li>Developers don’t have to code complex SQL joins </li></ul></ul><ul><ul><li>Results in greatly improved performance </li></ul></ul><ul><ul><li>Views can be optimized and indexed </li></ul></ul>
  46. 47. Joined Views <ul><ul><li>Views can map directly to application objects </li></ul></ul><ul><ul><li>Can join relational and XML data </li></ul></ul><ul><ul><li>Can enforce security </li></ul></ul><ul><ul><li>Allows different users to have different views of the data </li></ul></ul><ul><ul><li>Can be used to support encryption </li></ul></ul>
  47. 48. Joined Views <ul><ul><li>Can support customized application trigger code via “Instead-Of” triggers </li></ul></ul><ul><ul><li>Data fields can be given user-friendly names </li></ul></ul><ul><ul><li>Column widths and datatypes can be changed from standard classword format </li></ul></ul><ul><ul><li>Supports data conversion and reformatting </li></ul></ul>
  48. 49. Joined Views <ul><ul><li>Encapsulates data access without introducing coupling (denormalization) or diminishing cohesion in the database </li></ul></ul><ul><ul><li>Decouples application from database schema </li></ul></ul><ul><ul><li>Can be developed incrementally as the application develops, supporting a true “agile” approach! </li></ul></ul>
  49. 50. Task TaskIdentifier [IDENTITY] TaskDescription [varchar(2000)] ProjectIdentifier [int – FK] AccountingCode [char(4) – FK] OvertimeApprovedIndicator [bit] TaskEnteredDateTime [datetime] Timestamp [timestamp] TaskStartDateTime [datetime] TaskEndDateTime [datetime] Account AccountingCode [char(4)] AccountDescription [varchar(75)] Timestamp [timestamp] Employee EmployeeIdentifier [IDENTITY] EmployeeLastName [varchar(75)] EmployeeFirstName [varchar(75)] Timestamp [timestamp] EmployeePhoneNo [varchar(12)] EmployeeEmail [varchar(255)] OTHoursToDate [decimal] ProjectDescription [varchar(2000)] Project ProjectIdentifier [IDENTITY] ProjectMgrEmployeeID [int – FK] Timestamp [timestamp] ProjectDescription [varchar(75)] TaskAssignment AssignmentStartDate [datetime] Timestamp [timestamp] TaskIdentifier [int – FK] EmployeeIdentifier [int – FK] ScheduledEndDate [datetime] HoursWorkedToDate [decimal] OTHoursToDate [decimal] Normalized application tables
  50. 51. EmployeeTasks Account [varchar(75)] OTApproved [char(3)] HoursToDate [decimal] StartDate [char(10)] EndDate [char(10)] EmpName [varchar(120)] Project [varchar(75)] ProjectMgr [varchar(120)] Task [varchar(75)] OverTime [decimal] Customized application view
  51. 52. SQL code to create the view CREATE VIEW EmployeeTasks (EmpName, Project, ProjectMgr, Task, Account, OTApproved, StartDate, EndDate, HoursToDate, OverTime) AS SELECT CONVERT(varchar(120), emp.EmployeeFirstName + ‘ ‘ + emp.EmployeeLastName), proj.ProjectDescription, CONVERT(varchar(120), emp2.EmployeeFirstName + ‘ ‘ + emp2.EmployeeLastName), CONVERT(varchar(75), task.TaskDescription), acct.AccountDescription, CASE task.OvertimeApprovedIndicator WHEN 1 THEN ‘Yes’ ELSE ‘No’ END, CONVERT(varchar, ta.AssignmentStartDate, 101), CONVERT(varchar, ta.AssignmentEndDate, 101), ta.OTHoursToDate FROM TaskAssignment ta INNER JOIN Task task ON ta.TaskIdentifier = task.TaskIdentifier INNER JOIN Employee emp ON ta.EmployeeIdentifier = emp.EmployeeIdentifier INNER JOIN Project proj ON task.ProjectIdentifier = proj.ProjectIdentifier INNER JOIN Employee emp2 ON proj.ProjectMgrEmployeeID = emp2.EmployeeIdentifier INNER JOIN Account acct ON task.AccountingCode = acct.AccountingCode
  52. 53. Mapping Object to View AssignTask (EmpName, Project, Task, StartDate, EndDate) CompleteTask(EmpName, Project, Task) ApproveOT (EmpName, Project, Task, ProjectMgr) EmployeeTasks Account [varchar(75)] OTApproved [char(3)] HoursToDate [decimal] StartDate [char(10)] EndDate [char(10)] EmpName [varchar(120)] Project [varchar(75)] ProjectMgr [varchar(120)] Task [varchar(75)] OverTime [decimal] EmployeeTask Account [varchar(75)] OTApproved [char(3)] HoursToDate [decimal] StartDate [char(10)] EndDate [char(10)] EmpName [varchar(120)] Project [varchar(75)] ProjectMgr [varchar(120)] Task [varchar(75)] OverTime [decimal]
  53. 54. Work Tables <ul><ul><li>Allow pre-joining of data without normalizing base tables </li></ul></ul><ul><ul><li>Can improve application performance </li></ul></ul><ul><ul><li>Useful for unpacking recursive data to support applications (and views) </li></ul></ul><ul><ul><li>Impose a maintenance burden, so use sparingly and carefully! </li></ul></ul>
  54. 55. Work Tables <ul><ul><li>Are generally application-specific </li></ul></ul><ul><ul><li>Need to manage redundancy; base tables contain the “data of record” </li></ul></ul><ul><ul><li>Can be updated transactionally (from application procedure call) or periodically (via a scheduled process) </li></ul></ul>
  55. 56. ADO.NET <ul><ul><li>ADO.NET datasets can be updated using stored procedures </li></ul></ul><ul><ul><li>XML can easily be converted to dataset form for updating </li></ul></ul><ul><ul><li>LINQ will provide the ability to create updateable encapsulation objects in .NET </li></ul></ul>
  56. 57. ADO.NET <ul><li>Example of .NET Dataset Updating </li></ul>
  57. 58. Stored Procedures <ul><ul><li>Can encapsulate data-specific application or business processes </li></ul></ul><ul><ul><li>Results in greatly improved performance </li></ul></ul><ul><ul><li>Reduce network traffic </li></ul></ul>
  58. 59. Stored Procedures <ul><ul><li>Makes debugging, performance tuning and maintenance easier </li></ul></ul><ul><ul><li>Can be used to enforce security </li></ul></ul><ul><ul><li>Should be testable and reusable! </li></ul></ul>
  59. 60. Stored Procedures <ul><li>Sample Application View </li></ul><ul><li>Sample Wrapper Procedure </li></ul>
  60. 61. Triggers <ul><ul><li>Can encapsulate data-specific application or business processes </li></ul></ul><ul><ul><li>Useful for complex and cross-database RI checking and updating </li></ul></ul><ul><ul><li>“ Instead Of” triggers can be used to map updates on views to underlying base tables </li></ul></ul>
  61. 62. Triggers <ul><ul><li>Can be used to support auditing of database updates </li></ul></ul><ul><ul><li>Can send messages to applications and invoke application objects </li></ul></ul><ul><ul><li>Can use CLR code in triggers to replace extended stored procedures and OLE Automation </li></ul></ul>
  62. 63. Triggers <ul><li>Example: sample application view </li></ul><ul><li>Instead-Of trigger on application view </li></ul><ul><li>Example: database audit trigger </li></ul>
  63. 64. User-defined Datatypes <ul><ul><li>Scalar UDTs can be used to help enforce domain constraints </li></ul></ul><ul><ul><li>Object UDTs can be used to create complex data structures that map more readily to application objects (Oracle Jpublisher; MS LINQ) </li></ul></ul><ul><ul><li>XML UDTs support hierarchical data and can enable relational data to be more easily accessed by web services </li></ul></ul>
  64. 65. User-defined Functions <ul><ul><li>Useful for managing UDTs </li></ul></ul><ul><ul><li>Useful for datatype conversion and data reformatting </li></ul></ul><ul><ul><li>Are a useful wrapper for views </li></ul></ul><ul><ul><li>Cannot be used for updating </li></ul></ul><ul><ul><li>Cannot display or print in functions </li></ul></ul>
  65. 66. User-defined Functions <ul><ul><li>Can make relational data look like XML (and vice-versa) </li></ul></ul><ul><ul><li>Can only call other functions and extended stored procedures from functions </li></ul></ul><ul><ul><li>SQL code in functions is NOT optimized; may cause performance problems in joins </li></ul></ul>
  66. 67. User-defined Functions <ul><li>Sample application view </li></ul><ul><li>Function to get application data </li></ul><ul><li>Procedure to update application data </li></ul><ul><li>Sample execution </li></ul><ul><li>Output from sample execution </li></ul>
  67. 68. User-defined Functions (cont’d) <ul><li>Function to consolidate data records </li></ul><ul><li>Function to return consolidated records </li></ul><ul><li>Function to parse character map </li></ul><ul><li>Sample execution of parsing functions </li></ul><ul><li>Output from execution </li></ul>
  68. 69. User-defined Functions (cont’d) <ul><li>Function to return data as XML </li></ul><ul><li>Procedure to parse XML to table </li></ul><ul><li>Sample execution </li></ul><ul><li>Output from sample execution </li></ul>
  69. 70. Merging SQL and XML <ul><li>Merging SQL and XML Example 1 </li></ul><ul><li>Output from Example 1 </li></ul><ul><li>Merging SQL and XML Example 2 </li></ul><ul><li>Output from Example 2 </li></ul>
  70. 71. Developing an “Agile Attitude” <ul><li>Make using the database (and developing applications for databases) as quick, easy, and painless as possible. </li></ul><ul><li>Stay business-focused; the objective is meeting the business requirements and deriving the maximum business value from the project. </li></ul>
  71. 72. Developing an “Agile Attitude” <ul><li>Adopt a “can do” attitude, and be as helpful as possible. </li></ul><ul><li>Don’t let database standards become a threat to the success of a project. Accept any defeats and failures encountered during a project as “lessons learned”, that can be applied to future projects. </li></ul>
  72. 73. Developing an “Agile Attitude” <ul><li>Communicate with people on their level, and in their terms. </li></ul><ul><li>Concentrate on solving other people’s problems, not your own. </li></ul>
  73. 74. Developing an “Agile Attitude” <ul><li>Learn as much as possible about what your developers and business users do, and how and why they do it. Learn to become more of a “generalist”; this adds to your value. </li></ul><ul><li>Be flexible, and open to new ideas and new ways of doing things. But make sure that the things that need doing get done. </li></ul>
  74. 75. Bio and Contact Information <ul><li>Larry Burns has worked in IT for more than 25 years as a database administrator, application developer, consultant and teacher.  He holds a B.S. in Mathematics from the University of Washington and a Masters degree in Software Engineering from Seattle University.  He currently works for Paccar ITD Data Services as a database consultant on numerous application development projects, and teaches a series of data management classes for application developers.  He has been an instructor and advisor in the certificate program for Data Resource Management at the University of Washington in Seattle.  You can contact him at [email_address] . </li></ul>